匿名方法本質:內聯委派
傳統委派需分離方法定義與實例化;匿名方法將方法體內嵌於委派初始化處:
// 傳統
button1.Click += new EventHandler(OnClick);
void OnClick(object s, EventArgs e) { Debug.WriteLine("clicked"); }
// 匿名方法
button1.Click += delegate { Debug.WriteLine("clicked"); };
// 帶參數
button1.Click += delegate(object s, EventArgs e) { Debug.WriteLine("obj: " + s); };
- 參數列表可選,若提供必須符合委派簽名。
- 可用於任何需委派處:`InvokeDelegate(delegate() {...})`。
- 抽象 `Delegate` 參數需強制轉型:`(SomeDelegate)delegate() {...}`。
- 支援 `ref/out` 參數,不支援 `unsafe`、`goto/break/continue` 跳出區塊。
市場調查與實務觀察
- **優點**:減少委派實例化與分離方法的樣板碼,局部邏輯內聚。
- **缺點**:
- 巢狀委派傳遞時括號/分號/大括號層層疊加,極難閱讀:
BindClick(delegate { Debug.WriteLine("click"); });
void BindClick(EventHandler h) { button1.Click += h; }
- 線程場景雖省 `ThreadStart` 建構,但線程正確使用本身極難,匿名方法未本質降低複雜度。
- 良好命名的具名方法同樣可達到可維護性,且除錯堆疊可讀性更好。
總結與預測
- 匿名方法證明了「無名方法可存在並用於委派場合」。
- 實用性與普及度有待時間驗證,**預測不會超過運算子多載**,使用率較低。
- 但已成 .NET 一部分,**閱讀代碼時必須能識別**。
- 語言層面偏好具名方法;工程層面或許只是微軟某發明者「過度聰明」的產物。