private static int Add(int x, int y)
{
int result = x + y;
Console.WriteLine($"x + y = {result}");
return result;
}
private static int Sub(int x, int y)
{
int result = x - y;
Console.WriteLine($"x - y = {result}");
return result;
}
static void Main()
{
Add(8, 8);
Sub(8, 1);
}
缺點:呼叫端必須知道具體方法名稱,難以擴充新運算。
// 1. 定義委派型別
public delegate int BinaryOp(int x, int y);
// 2. 統一入口
public static void Calculate(int a, int b, BinaryOp op)
{
int result = op(a, b);
Console.WriteLine($"Result: {result}");
}
// 3. 使用
static void Main()
{
Calculate(10, 5, Add);
Calculate(10, 5, Sub);
Calculate(10, 5, (x, y) => x * y); // Lambda 內聯
}
| 視角 | 說明 |
|---|---|
| 類別視角 | 繼承 MulticastDelegate 的密封類別 |
| C++ 視角 | 型別安全的函式指標 |
| 介面視角 | 單一方法介面的替代品 |
「函式簽名」= 參數型別清單 + 回傳型別。委派型別即為一組簽名的命名。
// 這些方法簽名相同,可指派給同一委派
int Add(int a, int b);
int Sub(int a, int b);
int Mul(int a, int b);
Func<T, TResult>、Action<T>、Predicate<T>event 關鍵字限制委派存取BeginInvoke/EndInvoke(歷史)vs Task(現代)