本文根據 Microsoft 2003 年發布的技術白皮書,介紹 C# 下一個主要版本(後來的 C# 2.0)規劃的四大核心功能:泛型、迭代器、匿名方法、部分類型。雖然文件年代久遠,但這些概念已成為現代 C# 基石,回顧設計初衷有助於深入理解。
早期使用 object 型別配合裝箱/拆箱實作類泛型集合(如 Stack),存在三大問題:
InvalidCastException。IntStack, StringStack...)。public class Stack<ItemType>
{
private ItemType[] items;
public void Push(ItemType data) { ... }
public ItemType Pop() { ... }
}
// 使用時指定實際型別
Stack<int> intStack = new Stack<int>();
intStack.Push(3);
int x = intStack.Pop(); // 無需轉型,無裝箱
Stack<Customer> custStack = new Stack<Customer>();
custStack.Push(new Customer());
Customer c = custStack.Pop(); // 型別安全
Dictionary<KeyType, ValType>。當泛型內部需呼叫型別參數的特定成員(如 CompareTo),需加約束:
public class Dictionary<KeyType, ValType> where KeyType : IComparable
{
public void Add(KeyType key, ValType val)
{
// 現在可直接呼叫 key.CompareTo(...)
}
}
約束確保實例化時提供的型別滿足介面/基類要求,將錯誤提前到編譯期。
使用 yield return 簡化 IEnumerable 實作:
public IEnumerable<int> GetNumbers()
{
yield return 1;
yield return 2;
yield return 3;
}
編譯器自動產生狀態機,支援 foreach 與 LINQ 查詢。
內嵌程式碼區塊作為委派實例,捕獲外部變數(閉包):
button.Click += delegate(object sender, EventArgs e)
{
MessageBox.Show("Clicked at " + DateTime.Now);
};
後來演進為 Lambda 運算式 () => { ... }。
將單一類別定義拆分到多個檔案,利於設計工具產生代碼與手寫邏輯分離:
// File1.cs
public partial class MyForm { ... }
// File2.cs (設計工具產生)
public partial class MyForm { ... }
這四大特性圍繞「統一型別系統」、「元件導向開發」、「開發者控制力」與「實用語言結構」四大設計目標,奠定了 C# 2.0 乃至現代 C# 的核心能力。