一、概述 优点1:性能 对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和封箱操作。如arryList数组。 优点2:类型安全 优点3:二进制代码的重用 优点4:代码的扩展 二、泛型类 使用泛型类类型安全,不必装箱拆箱操作。 三、泛型类的功能 1.默认值 可以使用default关键字,通过default关键字,将null赋予引用类型,讲0赋予值类型。 2.约束 泛型支持集中约束功能 where T:struct 结构约束 where T:class 类约束必须是引用类型 where T:IFoo 接口约束 where T:Foo 必须派生自类Foo where T:new() 类型T必须有一个默认构造函数 where T1:T2 派生自泛型T2 3.继承 泛型类型可以实现泛型接口,也可以派生自一个类,泛型类型可以派生自一个泛型基类。 public class Base<T> { } public class Derived<T>:Base<string> { } 四、泛型接口 1.斜变和抗变 协变和抗变指对参数和返回值的类型进行转换。 public class Person:IComparable<T> { public int CompareTo(T other) { return this.LastName.CompareTo(other.LastName); } } 五、泛型方法 在泛型方法中,泛型类型用方法声明来定义。泛型方法可以在非泛型类中定义。 例如: 泛型方法如下: void Swap<T>(ref T x,ref T y) { T temp; temp = x; x = y; y = temp; } 泛型方法调用如下: int i=4; int j=5; Swap<int>(ref i,ref j); Swap(ref i,ref j);//因为C#编译器会通过Swap()方法来获取参数类型,所以不需要吧泛型类型赋予方法调用。 六、带委托的泛型方法 七、泛型方法的重载 using System; namespace Wrox.ProCSharp.Generics { public class MethodOverloads { public void Foo<T>(T obj) { Console.WriteLine("Foo<T>(T obj), obj type: {0}", obj.GetType().Name); } public void Foo(int x) { Console.WriteLine("Foo(int x)"); } public void Bar<T>(T obj) { Foo(obj); } } class Program { static void Main() { var test = new MethodOverloads(); test.Foo(33); test.Foo("abc"); test.Bar(44); } } } 显示结果: Foo(int x) Foo<T>(T obj), obj type: String Foo<T>(T obj), obj type: Int32