.NET Framework 3.5 (C# 3.0) 引入 Lambda 表達式,是委派與匿名方法的語法簡化,極大提升了函數式程式設計的表達力。本文從委派演進脈絡切入,詳細解析 Lambda 語法與實戰應用。
public delegate bool Filter(int num);
public int[] SearchArray(int[] values, Filter filter) {
List<int> result = new List<int>();
foreach (int i in values) {
if (filter(i)) result.Add(i);
}
return result.ToArray();
}
// 具名方法
public bool MyFilter(int num) {
return ((num & 1) == 0);
}
// 呼叫
int[] intArray = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] evenArray = SearchArray(intArray, MyFilter);
本質上,Filter 被編譯為繼承 System.MulticastDelegate 的類別,僅供編譯器使用,原始碼中不可直接撰寫。
int[] evenArray = SearchArray(intArray, delegate(int i) { return ((i & 1) == 0); });
以內聯程式碼取代獨立方法定義,簡化呼叫端撰寫。
語法結構:
(param1, param2, ..., paramN) => {
運算式1;
運算式2;
return 回傳值;
}
public delegate void Method1();
public void Test() {
Method1 method1 = () => { int i = 4; i += 6; };
}
public delegate void Method2(int i);
public void Test() {
Method2 method2 = i => { i++; i += 6; };
}
public delegate int Method3(int x, int y);
public void Test() {
Method3 method3 = (x, y) => { x++; y++; return x + y; };
}
int[] intArray = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] evenArray = SearchArray(intArray, i => { return (i & 1) == 0; });
// 或先指派給委派變數
Filter filter = i => { return (i & 1) == 0; };
int[] evenArray = SearchArray(intArray, filter);
Lambda 表達式經 C# 編譯器編譯後,仍會轉換為委派形式。它是語法層面的改進,非 IL 新指令。以下兩行程式碼等價:
Filter filter = i => { return (i & 1) == 0; };
Filter filter = delegate(int i) { return ((i & 1) == 0); };
掌握 Lambda 表達式,是掌握 LINQ、函數式程式設計與現代 C# 開發的關鍵基石。