簡介下委派的幾種使用方式
委派
delegate
相當於宣告一個 class 內的變數,其形態為 方法
委派 delegate C# 基本概念具現化 | 御用小本本 - 點部落 (dotblogs.com.tw)
Func<TResult>
相當於委派的區域變數版本
當作方法的傳入參數之一
只作用於該方法時使用
相對於委派的 class scope
可以理解為 function scope
範例
async Task Main()
{
// 呼叫 DoSomethingAsync 處理一些事情,同時將如何輸出到檔案的方法傳入
await DoSomethingAsync(
"參數1",
async Task (string message) =>
{
using (StreamWriter outputFile =
new StreamWriter(Path.Combine(@"D:\logs", "WriteTextAsync.txt")))
{
await outputFile.WriteAsync(message);
}
}
);
}
// You can define other methods, fields, classes and namespaces here
/// <summary>
/// 處理一些事情
/// </summary>
/// <param name="input">參數1</param>
/// <param name="outputFileFactory">輸出檔案的方法</param>
/// <returns></returns>
public async Task DoSomethingAsync(
string input,
Func<string, Task> outputFileFactory)
{
// TODO: 處理一些事情
// 將訊息輸出到檔案,但不關心如何輸出,輸出到哪裡
await outputFileFactory($"訊息: {input}");
// TODO: 繼續處理事情
}
對應關係圖
簡化版本
Action<T>
相當於 Func<TResult> 的 void 版本
也就是當你傳入的方法不需要回傳東西時改用 Action
剩下的泛型則一樣是該方法的傳入參數的型別
- void test() {} => Action<T> => Action
- int test() {return 1;} => Func<TResult> => Func<int>
先考慮要傳入的方法是否需要回傳東西 (Task, int, string … ETC.)
如都不需要則使用 Action
參照
使用委派 - C# 程式設計手冊 | Microsoft Learn