熟悉面向對象編程的開發人員都深諳這種編程的好處,其中之一就是「代碼重用」,它大大提升了開發效率。泛型是CLR和編程語言提供的一種特殊機制,它支持另外一種形式的代碼重用,即「算法重用」。算法
CLR容許建立泛型引用類型和泛型值類型,還容許建立泛型接口和泛型委託,CLR容許在引用類型、值類型或接口中定義泛型方法。編程
泛型列表算法的FCL類稱爲List<T>(讀做List of Tee)。這個類是在System。Collections.Generic命名空間中定義的。泛型List類的設計者緊接在類名後添加了<T>,代表操做的是一個未指定的數據類型,T表示變量名,也稱爲類型參數(type parameter)。數組
根據Microsof的設計原則,泛型參數變量要麼稱爲T,要麼至少以大寫T開頭。大寫T表明類型(Type),就像大寫I表明接口(Interface)同樣。安全
List<DateTime> dtlist=new List<DateTime>(),使用泛型類型或方法時,指定的具體數據類型稱爲類型實參(type argument)。編程語言
泛型爲開發人員提供的優點有:源代碼保護、類型安全、更加清晰的代碼和最佳的性能。ide
泛型最明顯的應用就是集合類。FCL已經定義了幾個泛型集合類,大多數都在System.Collections.Generic和System.Collections.ObjectModel命名空間中。要使用線程安全的泛型集合類,能夠到System.Collections.Concurrent命名空間去尋找。性能
泛型類型參數的類型稱爲開放類型(open type)若是爲全部類型實參傳遞的都是實際數據類型,類型就稱爲封閉類型(closed type)例如:DictionaryStringKey<T>爲開發類型,DictionaryStringKey<Guid>爲封閉類型。ui
元數,也就是類型要求的類型參數的個數。DictionaryStringKey<T>爲一元;DictionaryStringKey<T1,T2>爲二元,以此類推。spa
泛型類型同一性。using DateTimeList=System.Collections.Generic.List<System.DateTime>;Boolean sameType=(typeof(List<DateTime>)==typeof(DateTimeList));加上using纔不會喪失類型同一性(identity)和相等性(equivalence)線程
泛型類或接口 |
描述 |
對應的非泛型類型 |
Collection<T> ICollection<T> |
爲泛型容器提供基類 |
CollectionBase ICollection |
Comparer<T> IComparer<T> IComparable<T> |
比較兩個相同泛型類型的對象是否相等、可排序。 |
Comparer IComparer IComparable |
Dictionary<K, V> IDictionary<K,V> |
表示用鍵組織的鍵/值對集合。 |
Hashtable IDictionary |
Dictionary<K, V>.KeyCollection |
表示Dictionary<K, V>中鍵的集合。 |
None. |
Dictionary<K, V>.ValueCollection |
表示Dictionary<K, V>中值的集合。 |
None. |
IEnumerable<T> IEnumerator<T> |
表示能夠使用foreach 迭代的集合。 |
IEnumerable IEnumerator |
KeyedCollection<T, U> |
表示有鍵值的集合。 |
KeyedCollection |
LinkedList<T> |
表示雙向鏈表。 |
None. |
LinkedListNode<T> |
表示LinkedList<T>中的節點。 |
None. |
List<T> IList<T> |
使用大小可按需動態增長的數組實現 IList 接口 |
ArrayList IList |
Queue<T> |
表示對象的先進先出集合。 |
Queue |
ReadOnlyCollection<T> |
爲泛型只讀容器提供基類。 |
ReadOnlyCollectionBase |
SortedDictionary<K, V> |
表示鍵/值對的集合,這些鍵和值按鍵排序並可按照鍵訪問,實現IComparer<T>接口。 |
SortedList |
Stack<T> |
表示對象的簡單的後進先出集合。 |
Stack |