泛型-概述

概述編程

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

相關文章
相關標籤/搜索