自 2001 年 C# 面世以來,微軟持續依據四大設計目標——統一類型系統、組件化設計、開發者控制、實用語言結構——推進語言演進。本文回顧早期規劃中的「Visual Studio for Yukon」版本(即後來的 C# 2.0)預定引入的四大核心功能:泛型、迭代器、匿名方法、局部類型,並附帶設計動機與代碼範例。
object 基礎集合的裝箱/拆箱與類型不安全public class Stack {
private object[] items = new object[100];
public void Push(object data) { ... }
public object Pop() { ... }
}
Stack s = new Stack();
s.Push(3); // 裝箱
int i = (int)s.Pop(); // 拆箱 + 強制轉換
s.Push(new Customer());
Employee e = (Employee)s.Pop(); // 編譯通過,運行時崩潰
public class Stack {
private T[] items;
public void Push(T data) { ... }
public T Pop() { ... }
}
Stack stack = new Stack();
stack.Push(3); // 無裝箱
int x = stack.Pop(); // 無轉換,類型安全
Stack custStack = new Stack();
custStack.Push(new Customer());
Customer c = custStack.Pop(); // 編譯期保證類型正確
IntStack、StringStack…)。public class Dictionary where K : IComparable {
public void Add(K key, V val) {
// 可直接呼叫 key.CompareTo(...)
}
}
where 子句聲明約束(介面、基類、new()、class/struct),約束可多個介面、至多一個類。Stack、Stack 分離),本地存儲值,零轉換。object 引用操作),實例化時按類型大小分配記憶體,大幅減少代碼膨脹。對比 C++ 模板(編譯期展開、無約束、代碼膨脹大)與 Java 泛型(類型擦除、無值類型支持、運行時不可查類型參數),C# 泛型在運行時保留類型資訊,支援反射查詢,且由 CLR 原生實現。
IEnumerator 狀態機極繁瑣傳統模式需實現 GetEnumerator、MoveNext、Current、內部狀態追蹤,對樹等遞歸結構尤為複雜。
yield returnpublic class List {
internal object[] elements;
public object foreach() { // 迭代器方法
foreach (object o in elements) yield return o;
}
}
// 使用
foreach (string s in list) Console.WriteLine(s);
IEnumerable/IEnumerator 的狀態機類。yield return 暫停執行,下次 MoveNext 從該處繼續。允許在委托預期處直接內聯代碼塊,捕獲外部變量(this、局部變量、參數)。
button.Click += new EventHandler(delegate(object sender, EventArgs e) {
listBox.Items.Add(textBox.Text);
});
允許將單一類型定義拆分至多個源文件(partial class),便於大型類維護、工具生成代碼與手寫代碼分離。
// File1.cs
public partial class Foo { public void MyFunction() { } }
// File2.cs
public partial class Foo { public void MyOtherFunction() { } }
// 編譯後合併為單一類型
sharp@microsoft.com。