# 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; } } ```