C#講義-12 泛型_第1頁
C#講義-12 泛型_第2頁
C#講義-12 泛型_第3頁
C#講義-12 泛型_第4頁
C#講義-12 泛型_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、112 泛型n概述 n泛型類型參數(shù)n類型參數(shù)的約束n泛型類n泛型接口n泛型方法n常見泛型類21. 概述n泛型類和泛型方法同時具備可重用性、類型安全和效率 n泛型通常用與集合以及作用于集合的方法一起使用 n面向 2.0 及其以上版的所有應(yīng)用程序都使用新的泛型集合類,而不要使用舊的非泛型集合類 如ArrayListn當(dāng)然,也可以創(chuàng)建自定義泛型類型和方法,以提供自己的通用解決方案,設(shè)計類型安全的高效模式 3n在公共語言運行庫和 C# 語言的早期版本中,通用化是通過在類型與通用基類型 Object 之間進(jìn)行強(qiáng)制轉(zhuǎn)換來實現(xiàn)的 。ArrayList list1 = new ArrayList(); lis

2、t1.Add(3); list1.Add(105); ArrayList list2 = new ArrayList(); list2.Add(It is raining in Redmond.); list2.Add(It is snowing in the mountains.); 4n但這種方便是需要付出代價的: 添加到 ArrayList 中的任何引用或值類型都將隱式地向上強(qiáng)制轉(zhuǎn)換為 Object。如果項是值類型,則必須在將其添加到列表中時進(jìn)行裝箱操作,在檢索時進(jìn)行取消裝箱操作。 強(qiáng)制轉(zhuǎn)換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進(jìn)行循環(huán)訪問的情況下,裝箱和取消裝箱的影響非常

3、明顯。 注:裝箱box操作是在值類型轉(zhuǎn)換為引用類型時的操作。 5n另一個限制是缺少編譯時類型檢查;因為 ArrayList 會將所有項都強(qiáng)制轉(zhuǎn)換為 Object,所以在編譯時無法防止客戶端代碼執(zhí)行類似如下的操作:ArrayList list = new ArrayList(); list.Add(3); list.Add(It is raining in Redmond.); int t = 0; foreach (int x in list) t += x; 6n因此,ArrayList 需要一個類型參數(shù)。這正是泛型所能提供的。 List list1 = new List(); list1.

4、Add(3); 72 類型參數(shù) npublic class GenericList n在泛型類型或方法定義中,類型參數(shù)是客戶端在實例化泛型類型的變量時指定的特定類型的占位符。n類型形參聲明必須是標(biāo)識符,不能是類型。 public class GenericList n類型參數(shù)命名準(zhǔn)則 使用描述性名稱命名泛型類型參數(shù) 使用 T 作為具有單個字母類型參數(shù)的類型參數(shù)名 將“T”作為描述性類型參數(shù)名的前綴。 83 類型參數(shù)的約束 n在定義泛型類時,可以對客戶端代碼能夠在實例化類時用于類型參數(shù)的類型種類施加限制限制。如果客戶端代碼嘗試使用某個約束所不允許的類型來實例化類,則會產(chǎn)生編譯時錯誤。這些限制稱為

5、約束。n約束使用 where 關(guān)鍵字指定:public class GenericList where T: 9struct類型參數(shù)必須是值類型 class類型參數(shù)必須是引用類型 基類名 類型參數(shù)必須是指定的基類或派生自指定的基類 接口名稱 類型參數(shù)必須是指定的接口或?qū)崿F(xiàn)了指定的接口 n幾種常見的類型約束 : public class A public void f(); public class Class1 where T: A T t1; void g() t1.f(); 10114 泛型類 n泛型類最常用于集合,如鏈接列表、哈希表、堆棧、隊列、樹等。從集合中添加和移除項這樣的操作都以大

6、體上相同的方式執(zhí)行,與所存儲數(shù)據(jù)的類型無關(guān)。 n一般情況下,創(chuàng)建泛型類的過程為:從一個現(xiàn)有的具體類開始,逐一將每個類型更改為類型參數(shù),直至達(dá)到通用化和可用性的最佳平衡 n需要特別注意以下事項: 將哪些類型通用化為類型參數(shù)。 如果存在約束,應(yīng)對類型參數(shù)應(yīng)用什么約束 是否將泛型行為分解為基類和子類。 是否實現(xiàn)一個或多個泛型接口。12n常見的通用的泛型類:nSystem.Collections .Generic名稱空間下: Stack Queue HashSet List Dictionary135. 泛型接口 n為泛型集合類定義接口通常很有用,可以避免進(jìn)行類型轉(zhuǎn)換。 非泛型接口的定義: publi

7、c interface IComparable/ 非泛型接口 int CompareTo(object obj); public class Person : IComparable double height; public int CompareTo(object obj) Person p = obj as Person; / 類型轉(zhuǎn)換是很耗時的 if (this.height p.height ) return 1; else return -1; 14泛型接口的定義: public interface IComparable/ 泛型接口 int CompareTo(T other);

8、 public class Person : IComparable public double height; public int CompareTo(Person other) if (this.height other.height) / 沒有轉(zhuǎn)換,快速 return 1; else return -1; 156. 泛型方法 泛型類的成員可以是泛型的函數(shù):泛型類的成員可以是泛型的函數(shù):static void Swap(ref T lhs, ref T rhs) T temp; temp = lhs; lhs = rhs; rhs = temp; 不存在獨立的泛型函數(shù)。 與C+ 不同7.

9、 常用泛型類nList 表示可通過索引訪問的對象的強(qiáng)類型列表。提供用于對列表進(jìn)行搜索、排序和操作的方法。16成員成員意義意義復(fù)雜度復(fù)雜度add 尾部增加元素O(1)insert在某個位置插入元素O(n)contains 是否包含某元素O(n)clear移除所有元素O(n)Find尋找某條件的元素O(n)foreach遍歷每個元素O(n)remove移除某元素O(n)RemoveAt移除制定索引的元素O(n)sort 排序nlogn返回指定索引的元素O(1)count元素個數(shù)O(1)17nHashset n提供高性能的集合運算。集合是一組不重復(fù)出現(xiàn)且無特定順序的元素。1819成員成員意義意義復(fù)雜

10、度復(fù)雜度add 增加元素O(1)contains 是否包含某元素O(1)clear移除所有元素O(n)foreach遍歷每個元素O(n)remove移除某元素O(1)RemoveWhere移除某種特征的元素O(n)count元素個數(shù)O(1)n很多集合無法排序。如果需要排序則可以如下處理: class Node public int i; public int j; public Node( int pi,int pj) i=pi;j=pj; HashSet hs = new HashSet(); Random r = new Random(); for (int i = 0; i 5; i+)

11、 int temp= r.Next(100); hs.Add(new Node(temp, temp*2); foreach (Node n in hs) MessageBox.Show(n.i.ToString(); IEnumerable ie = hs.OrderBy(n = n.i); foreach (Node n in ie) MessageBox.Show(n.i.ToString();20nhs.OrderBy(n = n.i);nOrderBy的參數(shù)是一個委托Func keySelector nlambda 表達(dá)式。表示一個匿名函數(shù)。n運算符 =,讀為“goes to”。左邊是輸入?yún)?shù)(如果有),右邊包含表達(dá)式或語句塊。n可以將此表達(dá)式分配給委托類型delegate int del(int i);del myDelegate = x = x * x;int j = myDelegate(5); /j = 2521nDictionary泛型類提供了從一組鍵到一組值的映射。字典中的每個添加項都由一個值及其相關(guān)聯(lián)的鍵組成。n同Hashset類似。但是明確制定鍵值。n使用KeyValuePair 類型來訪問每個元素。n在f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論