概述
泛型並不是一個全新的結構,泛型不僅是C#編程語言的一部分,而且是程序集中的IL中間語言代碼緊密的集成,有了泛型就可以創建獨立於被包含類型的類和方法了,我們不必給不同類型編寫功能相同的許多方法和類,只創建一個方法和類就好。
優點和缺點
1、性能
C#類是引用類型,結構是值類型,對值類型使用非泛型集合類,在把值類型轉換為引用類型和把引用類型轉換為值類型時,需要進行拆箱和裝箱。裝箱和拆箱操作很容易使用,但性能損失比較大,遍歷許多項時尤其如此。
例子1:使用非泛型類將引用類型轉換為值類型
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性能高
2、類型安全
例子1:非泛型類ArrayList中添加一個整數、一個字符串和一個MyClass類型的對象
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());//編譯時報錯
3、二進制代碼的重用
4、代碼的擴展
因為泛型類的定義會放在程序集中,所以用特定類型實例化泛型類不會再IL代碼中復制這些類,但是在JIT編譯器把泛型類編譯為本地代碼時,會給每個值類型創建一個新類,引用類型共享一個本地類的所有相同的實現代碼,這是因為引用類型在實例化的泛型類中只需要4個字節的內存地址就可以引用一個引用類型。
5、命名約定
a,泛型類型的名稱用字母T作為前綴
b,如果沒有特殊要求,泛型類型允許使用任意類代替,且只使用了以個泛型類型,就可以用T作為泛型類型的名稱
c,如果泛型類型有特定的要求(例如,它必須實現一個借口或派生自基類),或者使用了兩個或多個泛型類型,就應該給泛型類型使用描述性的名稱
如:SortedList<TKey,TValue>;