本文原為圖解教學,僅包含概念示意圖,無文字敘述。以下補充核心概念文字說明,配合原圖食用更佳。
委派是型別安全的函式指標。它封裝「方法簽章」(參數清單 + 回傳型別),讓方法可像物件一樣被指派、傳遞、呼叫。
+=),依序呼叫。+=`/`-=` 實際產生新委派實例,原實例不變。
// 1. 宣告委派型別
public delegate int Calculate(int a, int b);
// 2. 目標方法
public int Add(int a, int b) => a + b;
public int Mul(int a, int b) => a * b;
// 3. 實例化與呼叫
Calculate calc = Add; // 方法群組隱含轉換
int result = calc(3, 4); // 7
// 4. 多播
calc += Mul; // 串連
// 呼叫時依序執行,回傳值為最後一個方法的結果
result = calc(3, 4); // 12 (Mul 的結果)
// 5. 移除
calc -= Add;
result = calc(3, 4); // 12
| 委派 | 簽章 | 用途 |
|---|---|---|
Func<T1, T2, TResult> | (T1, T2) → TResult | 有回傳值的運算 |
Action<T1, T2> | (T1, T2) → void | 無回傳值的動作 |
Predicate<T> | T → bool | 條件判斷 (如 List.Find) |
Func f = (a, b) => a + b;
Action log = s => Console.WriteLine($"[LOG] {s}");
Predicate isEven = n => n % 2 == 0;
| 維度 | 委派 | 介面 |
|---|---|---|
| 封裝對象 | 單一方法 | 方法群合約 |
| 實作方式 | 方法群組/Lambda | 類別實作 |
| 狀態攜帶 | 閉包捕獲區域變數 | 類別欄位 |
| 多播 | 原生支援 | 需自行實作 (觀察者模式) |
→ 委派像「遙控器」,按鈕對應方法簽章,按下即執行連結的方法。
→ 多播鏈結:d = M1; d += M2; d += M3; 呼叫 d() 依序執行 M1→M2→M3。
→ Lambda `() => ...` 是匿名方法語法糖,自動推斷委派型別。
→ 策略模式:void Process(Func<int,int> strategy) 將演算法外部化注入。委派是 C# 函數式程式設計的基石,也是事件、LINQ、非同步、策略模式的底層支撐。理解「型別安全的方法容器」這一本質,即可靈活運用於各種解耦場景。