泛型的特性

1、性能(最主要的优点):
因为使用非泛型类来存储值类型或把引用类型转换为值类型时需要装箱和拆箱的操作。频繁的进行装箱和拆箱的操作会使系统性能下降,耗费资源。例如:
使用System.Collection命名空间的ArrayList类存储对象时,Add方法会将各个对象保存到该类中,这时若是值类型作为对象,会把值类型转换为引用类型,即会出现装箱操作,当要使用该类中的值时就要把该引用类型转换为值类型,即会出现拆箱操作。如下例子,把int型转为ArrayList类的一个对象,进行了装箱操作,然后把Arraylist的一个对象转换为int i1时会需要进行强制转换为int类型,进行了拆箱操作,当使用foreach()循环遍历Arraylist时也会自动的进行拆箱操作,
var list=new ArrayList();
list.Add(44);//boxing
int i1=(int)list[0];//unboxing
foreach( int i2 in list)
{
Console.WriteLine(i2);//unboxing
}
以下是使用System.Collection.Generic命名空间中的List<T>泛型例子,因为泛型不是类,不能直接创建对象,而是在使用时定义类型后再创建对象。
var list=new List<int>();
list.Add(44);//no boxing
int i1=list[0];//no unboxing
foreach(int i2 in list)
{
Console.WriteLine(i2);
}

2、类型安全
与使用Arraylist类一样,如果对象,就可以在这个集合中添加任意类型的对象,例如:
var list=new ArrayList();
list.Add(44);
list.Add("string");
list.Add("MyNewClass()");
这时如果使用foreach遍历时就会出现类型转换的异常。而如果使用泛型List<T>,泛型类型T需要程序员自己指定,这样也就避免了隐式类型转换的不可预料的异常。因为泛型List<T>的类型被定义后就只能把该类型的数据添加到集合中,不然编译器会因为Add()方法的参数无效而报错。

3、二进制代码的重用。一个泛型可供多个类型使用,因为泛型是在运行时工作的,所以.net平台中,泛型可以在一种语言定义,在任何其他.net语言中也可以使用。

4、代码的扩展
因为泛型类的定义会放在程序集中,所以用特定类型实例化泛型类不会在IL代码中复制这些类。但是,在JiT编译器把泛型类编译为本地代码时,会给每个值类型创建一个新类,引用类型共享同一个本地类的所有相同的实现代码。

原文地址:https://www.cnblogs.com/simpleZone/p/5113392.html