yield return 簡化列舉器實作,狀態機自動產生where、yield、partial 僅在特定語境有特殊意義,其他場合仍可作識別項Object 型別缺點:
InvalidCastException 風險// 非泛型 Stack
Stack s = new Stack();
s.Push(new Customer());
string x = (string)s.Pop(); // 編譯通過,執行炸裂
// 泛型 Stack<T>
Stack<Customer> s = new Stack<Customer>();
s.Push(new Customer());
Customer c = s.Pop(); // 型別安全,無轉型
s.Push(3); // 編譯錯誤
public class Stack<T> {
T[] items; int count;
public void Push(T item) { ... }
public T Pop() { ... }
}
// 使用:構造型別 Stack<int>
Stack<int> s = new Stack<int>();
s.Push(3);
int x = s.Pop(); // 直接得 int,無拆箱
T 為型別參數佔位符,使用時指定實際型別引數Stack<int> 內部儲存 int[] 而非 object[]Dictionary<K, V>int、double 不同碼)public class Dictionary<K, V> where K : IComparable<K> {
public void Add(K key, V value) {
if (key.CompareTo(other) < 0) ... // 直接呼叫,無轉型
}
}
// 多重約束
public class EntityTable<K, E>
where K : IComparable<K>, IPersistable
where E : Entity, new() { ... }
約束類型:介面、基類、new()(公用無參建構子)、class/struct(參考/值型別)、unmanaged、notnull、default。
void PushMultiple<T>(Stack<T> stack, params T[] values) {
foreach (T v in values) stack.Push(v);
}
// 呼叫:型別推斷自動判斷 T
Stack<int> s = new Stack<int>();
PushMultiple(s, 1, 2, 3, 4); // 推斷 T=int
// 傳統:獨立方法 + 委派建立
btn.Click += new EventHandler(Btn_Click);
void Btn_Click(object s, EventArgs e) { list.Add(txt.Text); }
// 匿名方法:內聯
btn.Click += delegate { list.Add(txt.Text); };
// 需存取參數時
btn.Click += delegate(object s, EventArgs e) {
MessageBox.Show(((Button)s).Text);
};
捕獲外部變數(閉包):匿名方法引用區域變數/參數 → 變數生命週期延長至委派可被 GC 為止。編譯器自動提升為封裝類別欄位。
// 簡化委派建立
btn.Click += Btn_Click; // 代替 new EventHandler(Btn_Click)
Apply(arr, Math.Sin); // 代替 new Function(Math.Sin)
public class Stack<T> : IEnumerable<T> {
public IEnumerator<T> GetEnumerator() {
for (int i = count - 1; i >= 0; --i)
yield return items[i]; // 產生下一個值
}
}
// 使用
foreach (int i in stack) Console.Write(i); // 隱式呼叫 GetEnumerator
yield return:產生值並掛起yield break:結束迭代IEnumeratorIEnumerable<T> 實現多種列舉方式// File1.cs (工具生成)
public partial class Customer {
private int id; private string name;
public Customer() { ... }
}
// File2.cs (手寫邏輯)
public partial class Customer {
public void SubmitOrder(Order o) { orders.Add(o); }
public bool HasOrders() { return orders.Count > 0; }
}
// 編譯合併為單一類別