Jakeuj's Notes master Help

C# delegate, Func<TResult>, Action<T> {id="CSharp-Delegate-Func-Action"}

簡介下委派的幾種使用方式

委派

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: 繼續處理事情 }

對應關係圖

1681801092 png

對應關係圖

簡化版本

1681803742 png

Action<T>

相當於 Func<TResult> 的 void 版本

也就是當你傳入的方法不需要回傳東西時改用 Action

剩下的泛型則一樣是該方法的傳入參數的型別

  • void test() {} => Action<T> => Action

  • int test() {return 1;} => Func<TResult> => Func<int>

先考慮要傳入的方法是否需要回傳東西 (Task, int, string … ETC.)

如都不需要則使用 Action

1681804146 png

Action

參照

使用委派 - C# 程式設計手冊 | Microsoft Learn

Func<TResult> 代理人 (System) | Microsoft Learn

Action<T> 代理人 (System) | Microsoft Learn

Jakeuj

PS5

  • delegate

  • 回首頁

本文章從點部落遷移至 Writerside

13 October 2025