泛型是 C# 2.0 / .NET 2.0 引入的里程碑特性,實現「型別參數化」,同時解決型別安全與效能(避免裝箱/拆箱)兩大痛點。本文系統整理泛型類別、介面、委派、方法定義、繼承規則、約束條件與執行期實例化機制。
public class Test
{
private T _name;
private S _age;
public Test(T name, S age) { _name = name; _age = age; }
public void Print() => Console.WriteLine($"{_name}, {_age}");
}
// 使用
var t = new Test("SHY520", 22);
t.Print();
子類別繼承泛型父類別時,必須滿足下列任一條件:
class Child : Test { } 。class Child : Test { } 或 class Child : Test { } 。
// 錯誤:父類別型別參數未綁定
class Child : Test { } // ❌
// 正確
class Child1 : Test { }
class Child2 : Test { }
class Child3 : Test { }
// 介面
public interface IList { T[] GetElements(); }
public interface IDictionary { void Add(K key, V value); }
// 實作
public class MyList : IList, IDictionary
{
public T[] GetElements() => throw new NotImplementedException();
public void Add(int key, T value) => throw new NotImplementedException();
}
// 委派
public delegate string FuncDelegate(T value);
static string F(int i) => "int";
static string G(string s) => "string";
var d1 = new FuncDelegate(G);
var d2 = new FuncDelegate(F);
public class GenericClass
{
public T GetValue(T t) => t; // 泛型方法
public int GetValue(int i) => i; // 多載
public void UseMethod()
{
int x = GetValue(10); // 明確指定型別參數
}
}
// 覆寫範例
abstract class Parent
{
public abstract K Test(K k, V v) where K : V;
}
class Child : Parent
{
public override T Test(T t, S s) => t; // 約束自動繼承
}
| 約束 | 語法 | 意義 |
|---|---|---|
| 實質型別 | where T : struct | T 必為 ValueType(不可為 nullable) |
| 參考型別 | where T : class | T 必為參考型別(類別、介面、委派、陣列) |
| 預設建構函式 | where T : new() | T 必須有 public 無參數建構函式 |
| 基類/介面 | where T : BaseClasswhere T : IInterface | T 必須繼承自指定類別或實作介面 |
| 非受控型別 | where T : unmanaged | T 為非受控型別(C# 7.3+) |
| 委派 | where T : Delegate | T 為委派型別(C# 7.3+) |
| Enum | where T : Enum | T 為列舉型別(C# 7.3+) |
多重約束以逗號分隔:where T : class, IComparable, new()。
List),JIT 以實際型別取代佔位符產生機器碼。List、List)。List、List 各一份),避免裝箱/拆箱。+, - 等運算子)。static T _field; ❌)。default(T) 取得型別預設值(C# 7.1+ 可簡寫 default)。泛型是 .NET 型別系統的核心支柱,掌握定義、繼承、約束與 JIT 實例化機制,能設計出高效能、強型別、可重用的元件。現代 C# 進一步引入預設介面方法、泛型數學介面(.NET 7+),將泛型能力推向新高度。