概述編程
泛型並非一個全新的結構,泛型不只是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>;