程式碼對比:同樣邏輯,兩種寫法
delegate int SampleDelegate(int x, int y);
class Program
{
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
}
}
字面差異六大項
| 項目 | 匿名方法 | Lambda 表達式 |
| 關鍵字 | delegate | 無 |
| return | 需寫 return | 隱含(運算式本體) |
| 參數型別 | 必須宣告 int x, int y | 型別推斷省略 |
| 大括號 | 需 { } | 運算式本體可省略 |
| 分號 | 區塊內需分號 | 運算式本體無分號 |
| 新符號 | — | => (goes to) |
逐項解析
- 型別推斷:編譯器根據委派簽章
SampleDelegate(int, int) 推斷 x, y 為 int,回傳型別推斷為 int。
- =>:讀作「goes to」,左邊為輸入參數,右邊為運算式/語句本體。
- 運算式本體 vs 語句本體:
(x, y) => x + y 為運算式本體(隱含 return);(x, y) => { return x + y; } 為語句本體(需大括號與 return),兩者等價。