首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Action 與 Func 泛型委派完全指南

     編輯:關於.NET

委派是 C# 函數式程式設計的基石。.NET 核心庫內建 Action、Func 系列泛型委派,涵蓋 0~16 參數,幾乎可取代所有自訂委派宣告,統一程式碼風格。

定義對照

委派回傳值參數數宣告範例
Actionvoid0delegate void Action()
Action<T>void1delegate void Action<T>(T arg)
...void2~16Action<T1,T2,T3...>
Func<TResult>TResult0delegate TResult Func<TResult>()
Func<T,TResult>TResult1delegate TResult Func<T,TResult>(T arg)
...TResult1~16Func<T1,T2,...,TResult>

兩者皆繼承 MulticastDelegate,支援多播合併(+/-)。

使用範例

static void Output(string s) => Console.WriteLine(s);
static int Add(int a, int b) => a + b;

var act = new Action<string>(Output);
act("Hello Action"); // 輸出: Hello Action

var func = new Func<int, int, int>(Add);
int sum = func(3, 5); // sum = 8
Console.WriteLine(sum);

Lambda 簡寫

Action act = s => Console.WriteLine($"Lambda: {s}");
Func func = (a, b) => a * b;

優缺點權衡

優點缺點
無需宣告新委派型別,減少樣板碼型別名稱無法表達業務意圖(如 EventHandler vs Action<object,EventArgs>)
統一風格,易讀、易維護參數超過 16 仍需自訂委派(極少見)
零效能損失,編譯器同等對待公開 API 建議仍用具名委派,語意更清晰

進階:Expression Tree 與委派互轉

Expression> expr = (a, b) => a + b;
Func compiled = expr.Compile(); // 編譯為委派
// 亦可用於 LINQ to SQL、動態查詢建構

建議

  • 內部實作、回呼、事件處理:優先使用 Action/Func。
  • 公開介面、事件定義:考慮具名委派(delegate void MyEventHandler(...))提升可讀性。
  • 參考張子陽經典文章《委托的進化:從 delegate 到 Action/Func》深入理解。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved