泛型将 类型参数 的概念引入了 .NET Framework。

泛型主要有两个优点:

   1、编译时可以保证类型安全。

   2、不用做类型转换,获得一定的性能提升。

泛型方法、泛型委托、泛型接口

   除了泛型类之外,还有泛型方法、泛型委托、泛型接口:

  泛型委托:

        //泛型委托
        public delegate void Del<T>(T item);        //声明一个泛型委托
        public static void Notify(int i) { }        //定义一个方法
        Del<int> m1 = new Del<int>(Notify);         //用委托代替定义的方法

  泛型接口:

      //泛型接口
      interface MyInteface<T1, T2, T3>
      {
          T1 Method1(T2 param1, T3 param2);
      }

      public class MyClass<T1, T2, T3> : MyInteface<T1,T2,T3>
      {
          public T1 Method1(T2 param1, T3 param2)
          {
              throw new NotImplementedException();
          }
      }

  泛型方法:

        //泛型方法
        public void Swap<T>(ref T t1, ref T t2)
        {
            T temp = t1;
            t1 = t2;
            t2 = temp;
        }
        public void Interactive()
        {
            string str1 = "a";
            string str2 = "b";
            Swap<string>(ref str1, ref str2);
            Console.WriteLine(str1 + "," + str2);
        }

泛型约束:

   可以给泛型的类型参数上加约束,要求这些类型参数满足一定的条件:

约束 说明
 where T : struct  类型参数需是值类型
 where T : class  类型参数需是引用类型
 where T : new()  类型参数要有一个 public 的无参构造函数
 where T : <base class name>  类型参数要派生自某个基类
 where T : <interface name>  类型参数要实现某个接口
 where T : U  这里 T 和 U 都是类型参数,T 必须是或者派生自 U

 

泛型例子

    public class List<T> { }

    其中,T 就是 System.Collections.Generic.List<T> 实例所存储类型的占位符。

    当定义泛型类的实例时,必须指定这个实例所存储的实例类型。