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的泛型实现)