程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 泛型-概述

泛型-概述

編輯:C#入門知識

概述

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved