首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 筆記:泛型核心概念與進階應用

     編輯:關於.NET

泛型優勢

  • 原始碼保護:使用泛型演算法無需存取演算法原始碼(相較 C++ 模板)。
  • 型別安全:相較 ArrayList。
  • 原始碼更清晰:無需拆箱、顯式轉換。
  • 效能更佳:避免裝箱。測試:迴圈 1000 萬次,List<T> 耗時 0.1 秒,ArrayList 耗時 2 秒。

16.1 FCL 中的泛型對應

  • List<T> 取代 ArrayList
  • Dictionary<TKey, TValue> 取代 Hashtable
  • Stack<T>、Queue<T> 分別取代 Stack、Queue
  • 介面對應:IList、IDictionary、ICollection、IEnumerator、IEnumerable、IComparer、IComparable 均有對應泛型版本(加上 <T>)。

16.3 泛型基礎結構

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 優化

CLR 為每種不同的方法/類型組合產生原生碼(乘法原理)。優化:引用類型的類型實參只編譯一次並共享程式碼(皆為指標);值類型無法共享,仍會「爆炸」。

16.4 泛型介面

以 IEnumerator<T> 為例,展示指定 T 與不指定 T 兩種實作方式。

16.5 泛型委派

允許值類型執行個體傳遞給回呼方法時不裝箱。

16.6 泛型方法

  • 泛型類別中的泛型方法,各自宣告的類型參數不可重名。
  • 型別推導:自動判斷泛型方法使用的類型(如 Swap<T>(ref T, ref T))。
  • 泛型方法多載:編譯器優先選擇更明確的非泛型多載,避免遞迴。

16.7 泛型與其他成員

C# 中屬性/索引子/事件/運算子/建構函式/解構函式不可為泛型;允許:class/struct/interface/function/delegate。

16.8 可驗證性與約束

泛型中 T 僅能使用 System.Object 方法。使用 where 約束可擴充可用方法:

  • 主要約束:class(引用類型)、struct(值類型)。
  • 次要約束:介面約束、裸類型約束(where T1 : T2)。
  • 建構函式約束:where T : new()。不可同時指定 new() 與 struct(多餘)。有 new() 約束時,引用類型也可 new T()。

其他可驗證問題:轉型需先轉 object;使用 default(T) 設定預設值;與 null 比較規則;泛型變數間比較規則;不可直接使用運算子操作泛型變數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved