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

Visual C# 2.0 匿名方法深度解析(五):閉包延長區域變數壽命、巢狀作用域編譯器產生巢狀類別機制

     編輯:關於C語言

閉包:延長區域變數壽命

匿名方法捕獲的區域變數,壽命超出外部方法範圍。此技術在其他語言稱為 closures,允許委派處理器存取外部方法定義的區域變數(out-of-band 資料),避免委派參數無限膨脹。

巢狀作用域與編譯器產生的巢狀類別

外層作用域變數 iTemp、內層 jTemp,匿名方法定義於內層並使用兩者:


public class Program
{
    public delegate void MyDelegate();
    public static void Main(string[] args)
    {
        MyDelegate dlg = null;
        int iTemp = 100;
        if (iTemp > 50)
        {
            int jTemp = 200;
            dlg = delegate
            {
                Console.WriteLine("iTemp: {0}, jTemp: {1}", iTemp, jTemp);
            };
        }
        dlg();
    }
}

編譯器產生的偽碼結構


public class Program
{
    // 外層作用域巢狀類別
    private class InnerClassScope1 { public int iTemp; }

    // 內層作用域巢狀類別
    private class InnerClassScope2
    {
        public void InstanceMethod()
        {
            Console.WriteLine("iTemp: {0}, jTemp: {1}",
                localObjectScope1.iTemp, jTemp);
        }
        public InnerClassScope1 localObjectScope1;
        public int jTemp;
    }

    public delegate void MyDelegate();
    public static void Main(string[] args)
    {
        MyDelegate dlg = null;
        InnerClassScope1 localObject1 = new InnerClassScope1();
        localObject1.iTemp = 100;
        if (localObject1.iTemp > 50)
        {
            InnerClassScope2 localObject2 = new InnerClassScope2();
            localObject2.localObjectScope1 = localObject1;
            localObject2.jTemp = 200;
            dlg = new MyDelegate(localObject2.InstanceMethod);
        }
        dlg();
    }
}

圖示:ILDASM 顯示編譯器自動產生的巢狀類別結構。

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