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

C# 2.0 新特性深度解析(十一):匿名方法編譯器實作原理與閉包機制

     編輯:關於C語言

無外部變數捕獲:私有方法降級

匿名方法未使用外部變數(僅用參數/類成員),編譯器生成私有方法:

<return type> __AnonymousMethod$<random>(<params>)
  • 方法名含 `$` 非法識別碼,IntelliSense 隱藏、不可直接呼叫。
  • 委派實例化:new SomeDelegate(__AnonymousMethod$00000000)。

捕獲外部變數:閉包類別生成

使用區域變數(外部變數)時,編譯器生成巢狀閉包類別:

__LocalsDisplayClass$<random>
{
    public OuterClass <this>;  // 外部類別 this 參考
    public string capturedVar; // 每個捕獲變數一個公共欄位
    public void __AnonymousMethod$<random>(params) { /* 方法體 */ }
}

生成邏輯偽代碼

// 原始碼
string msg = "Hello";
SomeDelegate del = delegate(string name) { MessageBox.Show(msg + " " + name); };
del("Juval");

// 編譯器生成
var locals = new __LocalsDisplayClass$00000001();
locals.<this> = this;
locals.msg = msg;
SomeDelegate del = new SomeDelegate(locals.__AnonymousMethod$00000000);
del("Juval");
  • <this> 欄位保存外部類別實例,存取類成員用。
  • 捕獲變數以值/引用語意複製至閉包實例(值型別複製、參考型別複製引用)。
  • 閉包實例生命週期延長至委派存活期間,可能延遲 GC(特別是事件處理器未解除註冊時)。

實務啟示

  • 理解閉包機制有助診斷記憶體洩漏(長壽命委派持有短壽命物件)。
  • 效能敏感熱路徑避免捕獲大量外部變數,改用傳參或結構體。
  • 偵錯時「區域變數」視窗會顯示閉包類別欄位,辨識需留意 `$` 命名特徵。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved