單型別參數泛型 Stack<T>
using System;
class Stack {
private T[] items;
private int count;
public Stack(int size) { items = new T[size]; count = 0; }
public void Push(T x) { items[count++] = x; }
public T Pop() { return items[--count]; }
}
class Test {
static void Main() {
Stack s = new Stack(10);
s.Push(111); s.Push(222);
Console.WriteLine(s.Pop() + s.Pop()); // 333
}
}
- 避免裝箱/拆箱,效能大幅提升 (值型別不轉為 object)。
- 型別安全:編譯期阻止錯誤型別推入。
- 程式碼復用:同一邏輯支援
int、double、string 等任意型別。
雙型別參數泛型 Stu<T, S>
using System;
public class Stu {
private T name;
private S age;
public Stu(T Name, S Age) { name = Name; age = Age; }
public void Show() { Console.WriteLine("姓名:{0}, 年齡:{1}", name, age); }
}
class Test {
static void Main() {
Stu t = new Stu("Athrun", 26);
t.Show(); // 姓名:Athrun, 年齡:26
}
}
- 慣用
<T, S>、<TKey, TValue> 命名。
- 可擴充至多型別參數 (如
Tuple<T1, T2, T3>)。
泛型限制條件
class Repository where T : class, new() { ... } // 必須為參考型別且有無參建構函式
class Calculator where T : struct { ... } // 必須為實值型別
class Service where T : IComparable { ... } // 必須實作介面
class Factory where T : BaseClass { ... } // 必須繼承基底類別
實務建議
- 集合類別優先使用
List<T>、Dictionary<TKey, TValue> 等泛型版本。
- 自訂演算法/資料結構盡量泛型化,提升復用與型別安全。
- 避免過度泛型導致程式碼膨脹 (Code Bloat),但在 .NET 運行時共享參考型別實作,實值型別各自實例化。