泛型

泛型的优点

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
{
 
}

  

原文地址:https://www.cnblogs.com/lztwj/p/7224935.html