ArrayList。List<T> 耗時 0.1 秒,ArrayList 耗時 2 秒。List<T> 取代 ArrayListDictionary<TKey, TValue> 取代 HashtableStack<T>、Queue<T> 分別取代 Stack、QueueIList、IDictionary、ICollection、IEnumerator、IEnumerable、IComparer、IComparable 均有對應泛型版本(加上 <T>)。CLR 為應用程式使用的每個類型建立內部資料結構,稱為「類型物件」。
class<T> 稱為「開放式類型」,CLR 禁止建構其執行個體。T 為實際類型時(如 class<Guid>),稱為「封閉式類型」,CLR 可建立執行個體。每個封閉式類型擁有自己的靜態欄位(即 List<String> 與 List<Int32> 各自擁有靜態欄位與 cctor)。在泛型上定義 cctor 可為類型參數加限制條件(如限制只能用於 enum)。
由於 List<T> 源自 System.Object,List<String> 也是。範例展示鏈結節點類別的兩種設計:僅支援單一泛型類型 vs. 基底類別 Node 加泛型衍生類別 TypeNode<T> 以支援異構資料。
CLR 為每種不同的方法/類型組合產生原生碼(乘法原理)。優化:引用類型的類型實參只編譯一次並共享程式碼(皆為指標);值類型無法共享,仍會「爆炸」。
以 IEnumerator<T> 為例,展示指定 T 與不指定 T 兩種實作方式。
允許值類型執行個體傳遞給回呼方法時不裝箱。
Swap<T>(ref T, ref T))。C# 中屬性/索引子/事件/運算子/建構函式/解構函式不可為泛型;允許:class/struct/interface/function/delegate。
泛型中 T 僅能使用 System.Object 方法。使用 where 約束可擴充可用方法:
class(引用類型)、struct(值類型)。where T1 : T2)。where T : new()。不可同時指定 new() 與 struct(多餘)。有 new() 約束時,引用類型也可 new T()。其他可驗證問題:轉型需先轉 object;使用 default(T) 設定預設值;與 null 比較規則;泛型變數間比較規則;不可直接使用運算子操作泛型變數。