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

C# 3.0 新特性:匿名方法與 Lambda 運算式完整指南

     編輯:關於C#

C# 2.0 引入匿名方法,C# 3.0 以 Lambda 運算式 (=>) 進一步簡化語法,並支援運算式樹 (Expression Tree) 奠基 LINQ。本文對比兩者語法、編譯器降級機制、變數捕獲語意與進階應用。

從委派到匿名方法再到 Lambda


// C# 1.0 命名方法
btn.Click += new EventHandler(Btn_Click);
void Btn_Click(object s, EventArgs e) { BindData(); }

// C# 2.0 匿名方法
btn.Click += delegate(object s, EventArgs e) { BindData(); };

// C# 3.0 Lambda 運算式 (陳述式主體)
btn.Click += (s, e) => { BindData(); };

// C# 3.0 Lambda 運算式 (運算式主體) - 單一運算式隱含回傳
Func add = (x, y) => x + y;

編譯器降級

  • 匿名方法/Lambda → 編譯器產生私有方法 (如 <>c__DisplayClass0_0.b__0) + 顯示類別捕獲區域變數。
  • 實例方法捕獲 this,靜態方法不捕獲。
  • Lambda 運算式主體 (=> expr) 可轉換為 Expression<TDelegate> 建構運算式樹;陳述式主體 (=> { }) 僅能轉委派。

Lambda 語法完整形式


// 參數型別可省略 (編譯器推斷)
(x, y) => x + y
(int x, int y) => x + y

// 無參數
() => Console.WriteLine("Hi")

// 多行陳述式
(x, y) => { var z = x + y; return z; }

// 非同步 Lambda
async (token) => await DoWorkAsync(token)

變數捕獲與閉包陷阱


var funcs = new List>();
for (int i = 0; i < 3; i++)
{
    int captured = i; // C# 5.0+ 迴圈變數每輪新建,無需此行
    funcs.Add(() => captured);
}
// C# 4.0 或舊版:全部輸出 3 (捕獲同一變數 i)
// C# 5.0+:輸出 0,1,2

C# 5.0 修正 foreach/for 迴圈變數捕獲語意,每輪迭代建立新變數副本。

運算式樹與 LINQ

  • Expression<Func x.Age > 18; 建構樹而非編譯委派。
  • IQueryable 提供者 (EF Core, LINQ to SQL) 解析樹轉譯 SQL。
  • 編譯執行:Func func = predicate.Compile();

實務建議

  • 簡單邏輯優先 Lambda,複雜邏輯提煉為具名方法利於除錯與測試。
  • 避免過長 Lambda 導致可讀性下降。
  • 事件訂閱若需取消訂閱,請使用具名方法而非匿名/Lambda (無法 -= 匿名委派)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved