泛型是 C#2.0 語言和公用語言運行庫 (CLR) 中的一個新功能。泛型將型別參數的概念引入 .NET Framework,型別參數使得設計如下類和方法成為可能:這些類和方法將一個或多個類型的指定延遲到用戶端代碼聲明並執行個體化該類或方法的時候。例如,通過使用泛型型別參數 T,可以編寫其他用戶端代碼能夠使用的單個類,而不致引入運行時強制轉換或裝箱操作.
使用泛型型別可以最大限度地重用代碼、保護類型的安全以及提高效能。
泛型最常見的用途是建立集合類。
.NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。應儘可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList,HashTable等。
下面我們就來說下,幾個泛型集合類的用法:
一.Dictionary
此類在 .NET Framework 2.0 版中是新增的。表示鍵和值的集合。命名空間:System.Collections.Generic,程式集:mscorlib(在 mscorlib.dll 中)
class TestGenericList
{
static void Main()
{
//聲明對象,參數表示,鍵是int類型,值是string類型
Dictionary<int, string> fruit = new Dictionary<int, string>();
try{
//加入重複鍵會引發異常
fruit.Add(1, "蘋果");
fruit.Add(2, "桔子");
fruit.Add(3, "香蕉");
fruit.Add(4, "菠蘿");
//參數錯誤將引發異常,如下所示
//fruit.Add("5", "aa");
}
catch (ArgumentException)
{
Console.WriteLine("添加錯誤!!!");
}
//因為引入了泛型,所以鍵取出後不需要進行Object到int的轉換,值的集合也一樣
foreach (int i in fruit.Keys)
{
Console.WriteLine("鍵是:{0} 值是:{1}",i,fruit);
}
//刪除指定鍵,值
fruit.Remove(1);
//判斷是否包含指定鍵
if (fruit.ContainsKey(1))
{
Console.WriteLine("包含此鍵");
}
//清除集合中所有對象
fruit.Clear();
}
}
Dictionary遍曆輸出的順序,就是加入的順序,這點與Hashtable不同,其它方法如:ContainsKey ,ContainsValue ,Remove 等,使用方法基本一致。
二、List類
注意:此類在 .NET Framework 2.0 版中是新增的。表示可通過索引訪問的對象的強型別列表。提供用於對列表進行搜尋、排序和操作的方法。命名空間:System.Collections.Generic,程式集:mscorlib(在 mscorlib.dll 中),List 類是 ArrayList 類的泛型等效類。
//聲明一個泛型類
class TestGenericList
{
static void Main()
{
//聲明一個List對象,只加入string參數
List<string> names = new List<string>();
names.Add("喬峰");
names.Add("歐陽峰");
names.Add("馬蜂");
//遍曆List
foreach (string name in names)
{
Console.WriteLine(name);
}
//向List中插入元素
names.Insert(2, "張三峰");
//移除指定元素
names.Remove("馬蜂");
}
}
在決定使用 List 還是使用 ArrayList 類(兩者具有類似的功能)時,記住 List 類在大多數情況下執行得更好並且是型別安全的。如果對 List 類的類型 T 使用參考型別,則兩個類的行為是完全相同的。但是,如果對類型 T 使用實值型別,則需要考慮實現和裝箱問題。
如果對類型 T 使用實值型別,則編譯器將特別針對該實值型別產生 List 類的實現。這意味著不必對 List 對象的列表元素進行裝箱就可以使用該元素,並且在建立大約 500 個列表元素之後,不對列表元素裝箱所節省的記憶體將大於產生該類實現所使用的記憶體。
其實我們也可以自己定義一個泛型類,如下所示:
//聲明一個泛型類
public class ItemList<T>
{
void Add(T item) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// 聲明一個對象,只能加入int型
ItemList<int> list1 = new ItemList<int>();
//聲明一個對象,只能加入Student類型,Student類為自訂類
ItemList<Student> list2 = new ItemList<Student>();
}
}
泛型的用法還有很多種,如泛型方法,泛型委派,泛型介面等。