[原]
泛型是CLR2.0中的新特性。
场景:
在CLR1.0中,如果要创建一个灵活的类或方法,但是该类或方法在编译期间并不能确定所使用的是什么类。
方案:
要解决这种问题,我们必须以Object类为基础。
弊端:
比如现在有一个方法:
public string doSomething(Object item)
{
....
}
这个方法既可以传进引用类型,也可以传入值类型。(在设计这个方法时,我们不能确定参数到底是引用类型,还是值类型。即使知道是引用类型,那么使用的是什么类,我们也不能 知道。所以我们把这个参数定义为Object)
从表面上来看,这种解决方案很美好,至少我实现了需求(编译期间无法确定所适用的类型)。
如果我们仔细观察,会发现这种解决方案存在两种问题:1.传递的是引用类型:没有了类型安全性,所以需要强制类型转换。 2.传递的是值类型:需要装箱(eg. Int ---> Object),这样会有损性能,特别是多次装箱的场景下,对性能的影响尤为突出。
由此,我们至少看出CLR2.0中的泛型带来的两点好处:
1.性能(避免了装箱和拆箱操作) 2.类型安全。
此外,还有几点好处:
1.二进制代码的重用 2.代码的扩展 3.命名约定