直接比較同樣功能的匿名方法與 Lambda:
delegate int SampleDelegate(int x, int y);
static void Calculate(int x, int y, SampleDelegate calculator) {
Console.WriteLine(calculator(x, y));
}
static void Main() {
// 匿名方法
Calculate(1, 2, delegate(int x, int y) { return x + y; }); // 輸出 3
// Lambda 表達式
Calculate(1, 2, (x, y) => x + y); // 輸出 3
}
delegate 關鍵字消失:被 => 運算子取代,從 8 字元減為 2 字元。return 關鍵字消失:Lambda 本身是「運算式」,單一運算式結果即為回傳值,無需 return。SampleDelegate 已定義參數為 int, int,編譯器可推斷 x, y 為 int。{ } 與分號 ; 消失:因為是運算式而非陳述式區塊。=> 運算子:讀作「輸入給…」,如 (x, y) => x + y 為「輸入 x, y 產出 x+y」。這些簡化並非魔法,而是編譯器利用現有型別資訊進行推斷,嚴謹性完全不減。
前面看到的都是「運算式 Lambda」。若邏輯較複雜需多行陳述式,可用大括號包裹形成「Statement Lambda」:
Action method = filename => {
if (filename == null)
Console.WriteLine("Hello!");
else
System.IO.File.WriteAllText(filename, "Hello!");
};
method(null); // 輸出 Hello!
method("hello.txt"); // 產生 hello.txt
| 形式 | 範例 |
|---|---|
| 運算式 Lambda | (n) => a == n; |
| 陳述式 Lambda | (n) => { return a == n; }; |
雖然字數增加,但當無法用單一運算式表達時,僅多一個 return 的成本完全可接受。
Lambda 與匿名方法同樣依賴目標委派型別進行型別推斷。若無法從上下文推斷型別(如直接指派給 var),兩者都無法使用。這點必須牢記。