首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 面試題:閉包定義與匿名委托/Lambda 捕獲外部變量

     編輯:程式設計綜合問答

定義

**閉包**:函數與其**詞法環境(捕獲的外部變量)的組合**。內部函數可訪問定義時作用域的變量,即使外部函數已返回。

代碼示例


Func MakeMultiplier(int factor) {
    return x => x * factor; // Lambda 捕獲 factor
}

var times3 = MakeMultiplier(3);
var times5 = MakeMultiplier(5);
Console.WriteLine(times3(10)); // 30
Console.WriteLine(times5(10)); // 50
// factor 應隨 MakeMultiplier 結束銷毀,但被 Lambda 閉包「捕獲」保活

與匿名委托/Lambda 關係

  • **匿名委托**(C# 2.0 `delegate { }`)與 **Lambda**(C# 3.0 `=>`)是**語法形式**,均可形成閉包。
  • 編譯器為捕獲變量生成**顯示類**,將變量封裝為字段,閉包實例持有該顯示類引用。
  • **經典陷阱**:循環中捕獲循環變量(`for (int i=0;i<3;i++) actions.Add(()=>i);` 所有 Action 打印 3),解決:`int copy=i;` 捕獲副本。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved