C# 2.0 引入多項提升開發效率的語言特性。本文系統整理匿名方法、迭代器、部分類型、靜態類別、全域命名空間限定符、編譯器警告控制等核心功能,附 IL 層級實作原理分析。
傳統實作 IEnumerable 需手寫巢狀列舉器類別。C# 2.0 編譯器自動生成狀態機:
public class CityCollection : IEnumerable<string> {
string[] cities = { "New York", "Paris", "London" };
public IEnumerator<string> GetEnumerator() {
for (int i = 0; i < cities.Length; i++)
yield return cities[i];
}
}
public IEnumerable<string> Reverse {
get {
for (int i = cities.Length - 1; i >= 0; i--)
yield return cities[i];
}
}
// 使用
foreach (string city in collection.Reverse) { ... }
public class BinaryTree<T> : IEnumerable<T> where T : IComparable<T> {
Node<T> root;
public IEnumerable<T> InOrder => ScanInOrder(root);
IEnumerable<T> ScanInOrder(Node<T> node) {
if (node.Left != null)
foreach (T item in ScanInOrder(node.Left)) yield return item;
yield return node.Item;
if (node.Right != null)
foreach (T item in ScanInOrder(node.Right)) yield return item;
}
}
效能提醒:遞迴迭代每層呼叫產生新迭代器物件,深度樹可能產生大量 Gen0 物件。高效能場景建議改用堆疊手動實作。
// File1.cs
public partial class MyClass {
public void Method1() { }
}
// File2.cs
public partial class MyClass : IMyInterface {
public void Method2() { }
public int Number;
}
規則:
delegate void SomeDelegate();
SomeDelegate d = delegate { MessageBox.Show("Hello"); };
d();
delegate void D(string s);
D d = delegate(string s) { Console.WriteLine(s); };
d("Hello");
// 捕獲區域變數
string msg = "Hello";
D d2 = delegate(string name) { Console.WriteLine(msg + " " + name); };
d2("World");
__AnonymousMethod$XXX__LocalsDisplayClass$XXX 包含捕獲變數與 <this> 參考public class SafeLabel : Label {
delegate void SetTextDel(string text);
delegate string GetTextDel();
public override string Text {
set {
if (InvokeRequired)
Invoke(new SetTextDel(delegate(string t) { base.Text = t; }), value);
else base.Text = value;
}
get {
if (InvokeRequired)
return (string)Invoke(new GetTextDel(delegate { return base.Text; }));
return base.Text;
}
}
}
// C# 1.1
SomeDelegate d = new SomeDelegate(MethodName);
// C# 2.0
SomeDelegate d = MethodName;
// 異步呼叫雙重推論
delegate int Calc(int x, y);
Calc c = (a, b) => a + b; // C# 3.0 lambda,2.0 需用匿名方法
IAsyncResult ar = c.BeginInvoke(1, 2, CallbackMethod, null);
| 特性 | 語法 | 用途 |
|---|---|---|
| 屬性存取修飾詞 | public string Name { get; protected set; } | 分離讀寫可見性 |
| 靜態類別 | public static class Utility { } | 編譯器強制僅含靜態成員、不可實例化、不可繼承 |
| 全域命名空間限定 | ::System.Console.WriteLine() | 解決巢狀命名空間衝突 |
| 區域警告控制 | #pragma warning disable 169 | 精確抑制特定警告 |