C#2.0 序列教程 (1) - 泛型
熟悉C++的朋友,应该对于模板情有独钟,熟悉c++也不能不知道ATL。当然这个一种高效快捷的编程技术,到了C#里面,做了稍微的修改,有了个新的名字,叫 泛型。
一、泛型基本概念
泛型代码:调用者能决定代码操作的类型的代码。
二、泛型的优点
1、在C#1.0中,为了代码能通用,可以通过(装箱、拆箱) 通用基类(object)来实现。 但这样的代码只能在运行时抛出类型异常, 不能做到编译时类型安全。 在C#2.0中,可以使用泛型类来创建编译时进行类型安全检查的通用代码。
2、避免在集合存储值类型数据时装箱拆箱所带来的性能损耗
3、使用集合可利用intellisense功能。
三、泛型的语法
定义时使用类型占位符(类型参数)
e.g. : class DataOperate<T>
public int ExecuteSql<Tcommand>(string sql)
调用时用特定类型替代
e.g. : new DataOperate<SqlConnection>();
dao.ExecuteSql<SqlCommand>("delete from Users");
四、类型参数的命名
类型占位符以 T 开头
五、泛型 类型参数约束
5.1 为什么要约束 ?
编写泛型代码时, 会使用 类型参数所指定类型 的成员,编译器如何知道调用者所指定的 类型 是否支持这些操作呢? 所以需要对泛型的 类型参数 做一定程度的约束。
5.2 如何约束?
where关键字
e.g. : class SqlHelper<T> where T : 约束类型
5.3 约束分类
where T : struct 值类型
where T : class 引用类型
where T : new() 有无参构造函数
where T : <类> 必须是此类或其派生类
where T : <接口> 必须是此接口或其实现类
where T : T1 裸类型约束,约束类型参数之间的关系
无约束
5.4 约束可在不冲突的情况下组合使用
六、泛型类 示例
public class SqlHelper<Tconnnection, Tparameter, Tcommand>
where Tconnnection : DbConnection, new()
where Tparameter : DbParameter
where Tcommand : DbCommand, new()
{
public int ExecuteNonQuery(string connstr, string sql, params Tparameter[] parms)
{
using (Tconnnection cn = new Tconnnection())
{
cn.ConnectionString = connstr;
cn.Open();
Tcommand cmd = new Tcommand();
cmd.CommandText = sql;
cmd.Connection = cn;
foreach (Tparameter p in parms)
cmd.Parameters.Add(p);
return cmd.ExecuteNonQuery();
}
}
}
七、泛型接口 示例
interface IBaseInterface<T> { }
八、泛型方法 示例
public string M<T>(T i) where T : struct
{
}
注意: 类型参数的个数也是方法重载的一个新的依据
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
九、泛型委托 示例
delegate Trt 委托名<Trt, Tin>(Tin args);
十、.Net框架中常用的泛型类
System.Collections.Generic 命名空间
List<T> (ArrayList的泛型实现)
Dictionary<TKey,TValue>(Hashtable的泛型实现)