泛型是 C#2.0 語(yǔ)言和公共語(yǔ)言運(yùn)行庫(kù) (CLR) 中的一個(gè)新功能。泛型將類型參數(shù)的概念引入 .NET Framework,類型參數(shù)使得設(shè)計(jì)如下類和方法成為可能:這些類和方法將一個(gè)或多個(gè)類型的指定推遲到客戶端代碼聲明并實(shí)例化該類或方法的時(shí)候。例如,通過(guò)使用泛型類型參數(shù) T,可以編寫其他客戶端代碼能夠使用的單個(gè)類,而不致引入運(yùn)行時(shí)強(qiáng)制轉(zhuǎn)換或裝箱操作. class TestGenericList { static void Main() { //聲明對(duì)象,參數(shù)表示,鍵是int類型,值是string類型 Dictionary<int, string> fruit = new Dictionary<int, string>(); try{ //加入重復(fù)鍵會(huì)引發(fā)異常 fruit.Add(1, "蘋果"); fruit.Add(2, "桔子"); fruit.Add(3, "香蕉"); fruit.Add(4, "菠蘿"); //參數(shù)錯(cuò)誤將引發(fā)異常,如下所示 //fruit.Add("5", "aa"); } catch (ArgumentException) { Console.WriteLine("添加錯(cuò)誤?。?!"); } //因?yàn)橐肓朔盒停枣I取出后不需要進(jìn)行Object到int的轉(zhuǎn)換,值的集合也一樣 foreach (int i in fruit.Keys) { Console.WriteLine("鍵是:{0} 值是:{1}",i,fruit); } 按鍵值對(duì)遍歷: foreach(KeyValuePair keyValue in fruit) { Console.WriteLine("鍵是:{0} 值是:{1}", keyValue.Key, keyValue.Value); } //刪除指定鍵,值 fruit.Remove(1); //判斷是否包含指定鍵 if (fruit.ContainsKey(1)) { Console.WriteLine("包含此鍵"); } //清除集合中所有對(duì)象 fruit.Clear(); } } Dictionary遍歷輸出的順序,就是加入的順序,這點(diǎn)與Hashtable不同,其它方法如:ContainsKey ,ContainsValue ,Remove 等,使用方法基本一致。二、List類 注意:此類在 .NET Framework 2.0 版中是新增的。表示可通過(guò)索引訪問(wèn)的對(duì)象的強(qiáng)類型列表。提供用于對(duì)列表進(jìn)行搜索、排序和操作的方法。命名空間:System.Collections.Generic,程序集:mscorlib(在 mscorlib.dll 中),List 類是 ArrayList 類的泛型等效類。 //聲明一個(gè)泛型類 class TestGenericList { static void Main() { //聲明一個(gè)List對(duì)象和ArrayList對(duì)應(yīng),只加入string參數(shù) List<string> names = new List<string>(); names.Add("喬峰"); names.Add("歐陽(yáng)峰"); names.Add("馬蜂"); //遍歷List foreach (string name in names) { Console.WriteLine(name); } //向List中插入元素 names.Insert(2, "張三峰"); //移除指定元素 names.Remove("馬蜂"); } } 在決定使用 List 還是使用 ArrayList 類(兩者具有類似的功能)時(shí),記住 List 類在大多數(shù)情況下執(zhí)行得更好并且是類型安全的。如果對(duì) List 類的類型 T 使用引用類型,則兩個(gè)類的行為是完全相同的。但是,如果對(duì)類型 T 使用值類型,則需要考慮實(shí)現(xiàn)和裝箱問(wèn)題。 如果對(duì)類型 T 使用值類型,則編譯器將特別針對(duì)該值類型生成 List 類的實(shí)現(xiàn)。這意味著不必對(duì) List 對(duì)象的列表元素進(jìn)行裝箱就可以使用該元素,并且在創(chuàng)建大約 500 個(gè)列表元素之后,不對(duì)列表元素裝箱所節(jié)省的內(nèi)存將大于生成該類實(shí)現(xiàn)所使用的內(nèi)存。 其實(shí)我們也可以自己定義一個(gè)泛型類,如下所示: //聲明一個(gè)泛型類 public class ItemList<T> { void Add(T item) { } } class TestGenericList { private class ExampleClass { } static void Main() { // 聲明一個(gè)對(duì)象,只能加入int型 ItemList<int> list1 = new ItemList<int>(); //聲明一個(gè)對(duì)象,只能加入Student類型,Student類為自定義類 ItemList<Student> list2 = new ItemList<Student>(); } } 泛型的用法還有很多種,如泛型方法,泛型委托,泛型接口等。 |
|
來(lái)自: XXG學(xué)習(xí)園 > 《C#》