委派是一種型別安全的函式指標。你可以把它想像成一個「方法的容器」:定義委派型別時,同時宣告了它能裝載的方法簽章(回傳型別、參數列表);實例化時,將符合簽章的方法「裝進去」;之後透過委派實例呼叫,實際執行的就是該方法。
// 普通類別
public class UserInfo { }
// 委派型別:回傳 void,參數 (object, EventArgs)
public delegate void EventHandler(object sender, EventArgs e);
// 實例化
UserInfo user = new UserInfo(); // new 類別
EventHandler handler = new EventHandler(MyMethod); // new 委派,傳方法名
// 或簡寫
EventHandler handler = MyMethod;
void MyMethod(object s, EventArgs e) { Console.WriteLine("Called!"); }
handler(sender, e); // 相當於 MyMethod(sender, e)
這個過程稱為「委派」:MyMethod 將執行權委託給 handler。
handler += MethodA;
handler += MethodB;
handler(); // 依序執行 MethodA → MethodB
handler -= MethodA; // 移除
| 委派 | 參數 | 回傳 | 用途 |
|---|---|---|---|
Action | 0~16 | void | 無回傳邏輯 |
Func<TResult> | 0~16 | TResult | 有回傳邏輯 |
Predicate<T> | 1 (T) | bool | 條件判斷 |
Action log = Console.WriteLine;
Func add = (a,b) => a+b;
Predicate isEven = x => x%2==0;
// 匿名方法 (C# 2.0)
handler = delegate(object s, EventArgs e) { Console.WriteLine("Anon"); };
// Lambda (C# 3.0+)
handler = (s, e) => Console.WriteLine("Lambda");
button.Click += (s,e) => ... 本質是委派訂閱。BeginInvoke/EndInvoke、Task.Run(Action) 皆基於委派。委派是 C# 函數式程式設計的基石:型別安全、支援多播、可序列化(跨 AppDomain)。掌握「定義簽章 → 實例化綁定方法 → 像呼叫方法一樣呼叫委派」三步驟,即可靈活運用於事件、回呼、LINQ、非同步等所有場合。