2012-07-26
泛型概述 使用泛型型別可以最大限度地重用代碼、保護類型的安全以及提高效能。
泛型最常見的用途是建立集合類。
.NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。應儘可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList。
您可以建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委派。
可以對泛型類進行約束以訪問特定資料類型的方法。
關於泛型資料類型中使用的類型的資訊可在運行時通過使用反射擷取。
優點 泛型類和泛型方法同時具備可重用性、型別安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用於集合的方法一起使用。.NET Framework 2.0 版類庫提供一個新的命名空間 System.Collections.Generic,其中包含幾個新的基於泛型的集合類。建議面向 .NET Framework 2.0 及更高版本的所有應用程式都使用新的泛型集合類,而不要使用舊的非泛型集合類如 ArrayList。 何時使用泛型集合
通常情況下,建議您使用泛型集合,因為這樣可以獲得型別安全的直接優點而不需要從基集合類型派生並實作類別型特定的成員。此外,如果集合元素為實值型別,泛型集合類型的效能通常優於對應的非泛型集合類型(並優於從非泛型基集合類型派生的類型),因為使用泛型時不必對元素進行裝箱。
下面的泛型型別對應於現有的集合類型:
List<(Of <(T>)>) 是對應於 ArrayList 的泛型類。
Dictionary<(Of <(TKey, TValue>)>) 是對應於 Hashtable 的泛型類。
Collection<(Of <(T>)>) 是對應於 CollectionBase 的泛型類。Collection<(Of <(T>)>) 可以用作基類,但與 CollectionBase 不同的是它不是抽象的。這樣使用起來要方便得多。
ReadOnlyCollection<(Of <(T>)>) 是對應於 ReadOnlyCollectionBase 的泛型類。ReadOnlyCollection<(Of <(T>)>) 不是抽象的,它具有一個建構函式,該建構函式使其易於將現有的 List<(Of <(T>)>) 公開為唯讀集合。
Queue<(Of <(T>)>)、Stack<(Of <(T>)>) 和 SortedList<(Of <(TKey, TValue>)>) 泛型類分別對應於與其同名的非泛型類。
其他類型 有幾種泛型集合類型沒有對應的非泛型型別:
LinkedList<(Of <(T>)>) 是一個通用連結清單,它提供運算複雜度為 O(1) 的插入和移除操作。
SortedDictionary<(Of <(TKey, TValue>)>) 是一個排序的字典,其插入和檢索操作的運算複雜度為 O(log n),這使得它成為 SortedList<(Of <(TKey, TValue>)>) 的十分有用的替代類型。
KeyedCollection<(Of <(TKey, TItem>)>) 是介於列表和字典之間的混合類型,它提供了一種儲存包含自己鍵的對象的方法。
LINQ to Objects LINQ to Objects 功能允許使用 LINQ 查詢訪問記憶體中的對象,但條件是該物件類型要實現 IEnumerable 或 IEnumerable<(Of <(T>)>)。LINQ 查詢提供了一種通用的資料訪問模式;與標準 foreach 迴圈相比,它通常更加簡潔,可讀性更高;這種查詢可提供篩選、排序和分組功能。LINQ 查詢還可提高效能。有關更多資訊,請參見 LINQ to Objects。
其他功能 一些泛型型別具有非泛型集合類型中沒有的功能。例如,List<(Of <(T>)>) 類(對應於非泛型 ArrayList 類)具有許多接受泛型委派(如允許指定搜尋列表的方法的 Predicate<(Of <(T>)>) 委託、表示操作每個列表元素的 Action<(Of <(T>)>) 委託和允許定義類型之間轉換的 Converter<(Of <(TInput, TOutput>)>) 委託)的方法。
List<(Of <(T>)>) 類允許指定您自己的用於排序和搜尋列表的 IComparer<(Of <(T>)>) 泛型介面實現。SortedDictionary<(Of <(TKey, TValue>)>) 和 SortedList<(Of <(TKey, TValue>)>) 類也具有此功能,此外還允許在建立集合時指定比較子。類似地,Dictionary<(Of <(TKey, TValue>)>) 和 KeyedCollection<(Of <(TKey, TItem>)>) 類允許您指定自己的相等比較子。