C# 泛型透過「參數化型別」實現同一份程式碼操作多種資料型別,是泛型程式設計範式的核心實踐。本文介紹 CLR 執行期支援、編譯兩階段模型、JIT 實例化機制與核心特性。
| 維度 | C# | C++ | Java |
|---|---|---|---|
| 支援層級 | CLR 執行期 | 編譯期 | 編譯期(型別擦除) |
| 跨語言互通 | 完整支援 | 無 | 僅限 JVM |
| 程式碼膨脹 | 參考型別共享,值型別各自實例化 | 每種型別獨立展開 | 單一程式碼共享 |
| 反射能力 | 完整保留泛型中繼資料 | 無 | 擦除後不可反射 |
Stack → IL 中 T 為佔位符。Stack 時,以 int 替換佔位符產生機器碼;Stack 共享參考型別程式碼;Stack 另行實例化。typeof(List) 、MethodInfo.GetGenericArguments() 等反射 API 完整可用。where T : Base, IFace, new(), struct/class 提供編譯期型別安全,犧牲 C++ 隱式鴨子類型靈活性。
// 合法
class Node { }
class Node2 { }
struct Point { public T X, Y; }
// 繼承規則
class A { }
class B : A { } // 合法
class C : A { } // 合法
class D : A { } // 合法
// class E : A { } // 非法:缺少型別引數
C# 泛型以 CLR 級實例化實現型別安全、效能與互通性的最佳平衡。理解兩階段編譯、JIT 共享策略與約束機制,是進階 .NET 開發的必修課。