# Delegate
當你在C#中使用delegate(委託)時,想像它是一種"指向方法的指針"。你可以把它理解為一個容器,裡面裝的是指向某個方法的"地址"。這樣,你就可以在程式的其他地方利用這個容器來調用這個方法,而不用直接知道或寫出這個方法的具體細節。
### 例子
1. 定義委託
```
// 定義一個委託類型,它指向返回void且接受一個string參數的方法
public delegate void MyDelegate(string message);
```
2. 使用委託
```
// 定義一個方法,與上面定義的委託類型匹配
public void ShowMessage(string message)
{
Console.WriteLine(message);
}
// 使用委託
MyDelegate del = new MyDelegate(ShowMessage); // 創建一個委託實例並指定要調用的方法
del("Hello, World!"); // 通過委託調用方法
```
<div style="text-align: center;">
<span style="color: green;">delegate 就像是一個"方法的地址簿",讓你可以靈活地調用不同的方法。</span>
</div>
<div style="text-align: center;">
<span style="color: green;">可以把delegate想成一種可以儲存和指向方法的變數。</span>
</div>
### 比較
#### 1. 使用自定義委託
```
// 定義自定義委託
public delegate int AddDelegate(int a, int b);
class Program
{
static void Main(string[] args)
{
// 創建自定義委託實例並指向方法
AddDelegate add = (a, b) => a + b;
// 使用委託
int result = add(5, 3); // result 將會是 8
// 輸出結果
Console.WriteLine(result);
}
}
```
<span>delegate AddDelegate 是一個自定義委託類型,表示一個接受兩個 int 類型參數並返回一個 int 類型結果的方法。
add 是這個自定義委託的實例,它指向一個匿名方法 (a, b) => a + b。
使用 add(5, 3) 調用這個委託,結果是 8。</span>
#### 2. 使用 Func
```
// 定義一個 Func 委託
Func<int, int, int> add = (a, b) => a + b;
// 使用委託
int result = add(5, 3); // result 將會是 8
```
* Func<int, int, int> 是一個預定義的委託類型,表示一個接受兩個 int 類型參數並返回一個 int 類型結果的方法。
* 最後一個 int 是 Func<int, int, int> 中的 TResult,表示返回值的類型。
* add 是這個函數的實例(或引用),它指向一個符合 Func<int, int, int> 的方法。
### 關鍵差別
* 預定義 vs. 自定義:
Func 是 C# 預定義的委託類型,適合大多數通用的用例。
自定義委託允許你定義具有特定名稱和簽名的委託,適合需要更多控制和表達的情況。
* 語法簡潔度:
Func 更簡潔,適合簡單場景。
自定義委託提供了額外的靈活性,但語法略顯繁瑣。
* 使用情境:
Func 適合簡單的場景,當你只需要一個具體的委託類型時。
自定義委託適合需要自定義名稱或有特定需求的情況。
### 較進階用法
```
using System;
class Program
{
static void Main(string[] args)
{
// 這裡的 (x, y) => x + y 是一個 lambda 表達式,
// 它符合 Func<int, int, int> 的要求,並被傳遞給 Calculate 方法作為 operation 參數。
int sum = Calculate(5, 3, (x, y) => x + y);
int difference = Calculate(5, 3, (x, y) => x - y);
Console.WriteLine($"Sum: {sum}"); // 輸出: Sum: 8
Console.WriteLine($"Difference: {difference}"); // 輸出: Difference: 2
}
// Calculate 方法接受兩個整數 a 和 b,以及一個 Func<int, int, int> 類型的委託 operation。
// operation 是一個方法或 lambda 表達式,它接受兩個 int 類型的參數並返回 int 類型的結果。
static int Calculate(int a, int b, Func<int, int, int> operation)
{
// 在這裡,operation 代表傳入的 lambda 表達式 (x, y) => x + y 或 (x, y) => x - y。
// 它被用來進行計算,並將結果存儲在 result 變數中。
// result 儲存的是 operation(a, b) 的結果,這裡的 result 其實就是存第三個 int 參數。
int result = operation(a, b);
return result;
}
}
```