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

Visual C# 2.0 匿名方法深度解析(四):區域變數捕獲機制、編譯器自動產生巢狀類別完整流程圖解

     編輯:關於C語言

匿名方法捕獲區域變數的編譯器魔法

看似無法存取區域變數的匿名方法,實際編譯器自動完成捕獲:


public class Program
{
    public delegate void MyDelegate();
    public static void Main(string[] args)
    {
        int iTemp = 100;
        MyDelegate dlg = delegate { Console.WriteLine(iTemp); };
        dlg();
    }
}

編譯器六步驟轉換流程

  1. 建立 private class InnerClass 巢狀類別
  2. 加入 public int iTemp 實例欄位
  3. 加入 public void InstanceMethod() 實例方法包裝匿名方法本體
  4. 以 InnerClass localObject = new InnerClass() 取代區域變數宣告
  5. 將匿名方法內外對 iTemp 的存取改為 localObject.iTemp
  6. 以 new MyDelegate(localObject.InstanceMethod) 取代匿名方法定義

轉換後偽碼


public class Program
{
    private class InnerClass
    {
        public void InstanceMethod() => Console.WriteLine(iTemp);
        public int iTemp;
    }

    public delegate void MyDelegate();
    public static void Main(string[] args)
    {
        InnerClass localObject = new InnerClass();
        localObject.iTemp = 100;
        MyDelegate dlg = new MyDelegate(localObject.InstanceMethod);
        dlg();
    }
}

圖示:ILDASM 顯示 Program 類別下自動新增的 InnerClass 巢狀類別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved