泛型的定义

所谓泛型,即通过参数化类型来实现在同一份代码上操作多中数据类型。泛型编程是一种编程范式 ,它利用“参数化类型”
将类型抽象化,从而实现更为灵活的复用。

泛型的优势
源代码保护

类型安全

清晰的代码

性能提高(值类型性能提高显著,引用类型一样)

泛型的本质

1. 初次编译时,首先生成IL代码和元数据,T只是作为类型占位符,不进行泛型类型的实例化。

2. 在进行JIT编译时,将以实际类型替换IL代码和元数据中的T占位符,并将其转换为本地代码,下一次对该泛型类型的引用

    将使用相同的本地代码。

泛型类型实例化的参数分为值类型和引用类型

值类型:JIT编译器会为不同的值类型创建不同的本地代码。

引用类型:由于引用类型变量都是指向托管堆的指针,而指针完全可以使用相同的方式操作,所以会共享本地代码的单个副本。

泛型的约束

在定义泛型类时,对于能够用于实例化类型参数的类型所作的限制,这种限制能够保证类型参数局限在一定

的目标范围,以实现在泛型类中的方法或者运算符能够得到类型参数的支持而不会引起其他问题。

约束主要包括:

构造器约束----T:new()

值类型约束----T:struct

引用类型约束----T:class

基类约束----T:基类名

接口约束----T:接口名

裸类型约束----T:U

泛型的方法

泛型方法即可以包含在泛型类型中,也可以包含在非泛型类型中

1.方法重载

    public class MyArrayList<T>
    {
        public T myData;

        public MyArrayList()
        {
            myData = default(T);
        }
        
        public void ShowInfo()
        {
            Console.WriteLine(myData.ToString());
        }

        public void ShowInfo<TData>(TData data)
        {
            Console.WriteLine(data.ToString());
        }
    }

 

由于类型参数在编译器并不确定,所以重载检查是在实例方法被调用时才发生。

2.类型推断

类型判断由编译器支持,表示编译器在调用时根据方法参数来对端类型参数,从而决定要使用的泛型方法,

因此,不适用与没有参数的方法。

3.泛型方法约束

泛型方法可以使用约束来对类型参数加以限制。

     public void ShowInfo<TData>(TData data) where TData:struct
     {
         Console.WriteLine(data.ToString());
     }