C# 2.0 引入,允許在需要委派的地方直接內嵌程式碼區塊,省去獨立方法定義。本質是編譯器自動產生具名方法的語法糖。
委派是型別安全的函數指標,支援多點廣播。傳統寫法:
button1.Click += new EventHandler(OnClick);
private void OnClick(object sender, EventArgs e) { ... }
// 無參數
button1.Click += delegate { Debug.WriteLine("Clicked"); };
// 使用參數(必須符合委派簽名)
button1.Click += delegate(object s, EventArgs e)
{
Debug.WriteLine("Sender: " + s);
};
// 作為方法參數傳遞
BindClick(delegate { Debug.WriteLine("Inline"); });
void BindClick(EventHandler h) => button1.Click += h;
ref/out 參數,但不可使用外層的 ref/out 變數。unsafe 程式碼。goto/break/continue 跳出區塊。「匿名方法減少委派實例化與分離方法的開銷,提升可用性與可維護性。」—— 官方文件
作者持懷疑態度:
<Main>b__0)。// 匿名方法
button.Click += delegate(object s, EventArgs e) { ... };
// Lambda(更簡潔、型別推斷、表達式樹支援)
button.Click += (s, e) => { ... };
Func add = (a,b) => a + b;
Lambda 解決了大部分語法雜訊,成為主流;匿名方法現僅為歷史遺產與相容性存在。
匿名方法證明了「無名方法」的可行性,但實務上建議:簡單回調用 Lambda,複雜邏輯用具名方法,保持程式碼清晰可維護。