概述编程
泛型并非一个全新的结构,泛型不只是C#编程语言的一部分,并且是程序集中的IL中间语言代码紧密的集成,有了泛型就能够建立独立于被包含类型的类和方法了,咱们没必要给不一样类型编写功能相同的许多方法和类,只建立一个方法和类就好。安全
优势和缺点编程语言
一、性能性能
C#类是引用类型,结构是值类型,对值类型使用非泛型集合类,在把值类型转换为引用类型和把引用类型转换为值类型时,须要进行拆箱和装箱。装箱和拆箱操做很容易使用,但性能损失比较大,遍历许多项时尤为如此。对象
例子1:使用非泛型类将引用类型转换为值类型blog
var list=new ArrayList(); list.Add(1);//值类型强制转换为引用类型 int il=(int)list[0];//引用类型强制转换为值类型 foreach(int i2 in list) { Console.WriteLine(i2);// unboxing }
例子2:List<T>类的泛型类型定义为Int,因此Int类型在JIT编译器动态生成的类中使用,再也不进行装箱和拆箱内存
var list=new List<int>(); list.Add(1);//泛型类并不须要装箱 int il=list[0]//此过程也不须要拆箱 foreach(var i2 in il) { Console.WriteLine(l2); }
结论:使用例子2要比使用例子1性能高字符串
二、类型安全编译器
例子1:非泛型类ArrayList中添加一个整数、一个字符串和一个MyClass类型的对象it
var list=new ArrayList(); list.Add(1);//添加数值 list.Add("hello world"); list.Add(new MyClass()); foreach(int i in list) { Console.WriteLine(i); }
当编译时不会出错,但代码容许时会异常,非泛型类致使了安全隐患的存在。
例子2:在泛型类List<int>中,泛型类型T定义了容许使用的类型,这种就只能把整数类型的元素添加在集合中,就避免了运行出错
var list =new List<int>(); list.Add(1); list.Add("hello world");//编辑时报错 list.Add(new MyClass());//编译时报错
三、二进制代码的重用
四、代码的扩展
由于泛型类的定义会放在程序集中,因此用特定类型实例化泛型类不会再IL代码中复制这些类,可是在JIT编译器把泛型类编译为本地代码时,会给每一个值类型建立一个新类,引用类型共享一个本地类的全部相同的实现代码,这是由于引用类型在实例化的泛型类中只须要4个字节的内存地址就能够引用一个引用类型。
五、命名约定
a,泛型类型的名称用字母T做为前缀
b,若是没有特殊要求,泛型类型容许使用任意类代替,且只使用了以个泛型类型,就能够用T做为泛型类型的名称
c,若是泛型类型有特定的要求(例如,它必须实现一个借口或派生自基类),或者使用了两个或多个泛型类型,就应该给泛型类型使用描述性的名称
如:SortedList<TKey,TValue>;