高階函數是函數式程式設計的核心概念,指「接受函數為參數」或「回傳函數」的函數。在 C# 語言發展史中,委托、匿名方法、Lambda 表達式三大特性的逐步引入,讓 .NET 平台對高階函數的支援從「可用」進化為「優雅」。
.NET 1.0 引入委托,本質是「封裝方法簽名的類別」。它使方法成為一等公民,可作為參數傳遞。Array.ConvertAll<TInput, TOutput> 是典型高階函數範例:
string[] dates = { "2009-01-01", "2009-01-02" };
DateTime[] result = Array.ConvertAll(dates,
new Converter<string, DateTime>(s => DateTime.ParseExact(s, "yyyy-MM-dd", null)));
C# 2.0 引入 delegate { ... } 語法,消除了為單次使用而專門撰寫命名方法的囉嗦。更關鍵的是,匿名方法支援閉包——捕獲外部區域變數,極大拓展了表達力:
// 延遲執行昂貴運算
void Process(Func<object> expensiveDataGetter) {
if (CanProcess()) DoSomething(expensiveDataGetter());
}
// 呼叫端:Process(() => GetExpensiveData(args));
=> 語法糖配合型別推斷,讓高階函數呼叫如同 Ruby/JS 般簡潔。.NET 3.5 更標準化了三大通用委托:
Func<TResult>:有回傳值Action<T>:無回傳值Predicate<T>:回傳 bool這使框架設計者能統一 API 簽名,如 TPL、LINQ、ASP.NET Core 中廣泛使用。
CacheHelper.Get 以三個委托參數封裝「快取檢查→資料源獲取→寫入快取」流程,無需繼承即可替換任意步驟邏輯。Java 透過單方法介面(SAM)+ 匿名類實現同樣語意,但語法冗長且無法修改外部區域變數(需 final),驗證了 C# 匿名函數設計的優越性。
善用高階函數不僅能減少樣板碼,更能將「演算法骨架」與「業務細節」解耦。在現代 .NET 開發中,它已成為事實標準——掌握它,是資深工程師的必修課。