泛型
泛型的优点
1.性能
泛型类在编译器中生成T类型的类,不会进行装箱和拆箱。
/* 对值类型使用非泛型集合类时,把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作。 装箱和拆箱操作性能损失较大。 */ ArrayList list = new ArrayList(); list.Add(1); //add方法的参数是object,装箱 list.Add("1"); int a = (int)list[0]; //注意这里需要强制转换 - 拆箱
2.类型安全
泛型类List<T>中,泛型类型 T 定义了允许使用的类型。
3.二进制代码的重用
泛型类定义一次,可以使用不同的类型实例化。
4.代码的扩展
值类型使用泛型类,编译器会为每个值类型生成一个新类,因为值类型对内存大小的要求不同。
引用类型使用泛型类,共享一个本地类的所有代码,因为引用类型在实例化的泛型类中只需4个字节,就可以引用一个实例。
创建泛型类
泛型类的定义和一般类相同,只是要使用类型T做泛型类型的声明。
泛型类的功能
1.默认值 default
创建泛型类时,内部对泛型类型 T 的初始化。
T t = default(T); //default 关键字,将null赋予应用类型,0赋予值类型
2.约束
创建泛型类时,对泛型类型 T 的要求。
class MyClass<T> where T : IDisposable, new() //可以有多个约束 { }
约束 | 说明 |
where T : strust | 类型T必须是值类型 |
where T : class | 类型T必须是引用类型 |
where T : IFoo | 类型T必须实现IFoo接口 |
where T : Foo | 类型T必须是Foo的派生类 |
where T : new() | 类型T必须有一个默认构造函数 |
where T1 : T2 | 泛型类中有多个泛型类型,其中类型T1是类型T2的派生类 |
3.继承
泛型类和类一样,可以继承和被继承。方法可以是抽象的,虚拟的。
4.静态成员
1.泛型类型的静态成员比较特殊。因为编译器会为值类型的泛型类创建一个新类,所以,泛型类中的静态成员并不能共享。
泛型接口
泛型接口的定义和一般接口相同,只是要使用类型T做泛型类型的声明。
泛型接口常常存在一个较老的非泛型版本,以后要进来使用泛型版本,因为可以避免拆装箱。
泛型接口的协变与逆变(不懂)
泛型结构(可空类型)
Nullable<T> 就是 int? 可空类型
泛型方法
1.普通泛型方法
public void Func<T>(T t) where T : class { }
2.带委托的泛型方法
public void Func<T>(Action<T> action) where T : class { }