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

CLR 匿名函數實現原理淺析 (3):多層作用域封裝類別與 Delphi 對比

     編輯:關於C語言

多層作用域封裝策略

每個不同區域變數作用域產生一個封裝類別,子作用域封裝類別引用父作用域封裝類別實例,相同作用域變數與匿名方法綁定在同一封裝類別,維持一致生命週期。

範例程式碼


delegate void NoArgs();
void SomeMethod()
{
    NoArgs[] methods = new NoArgs[10];
    int outer = 0;
    for (int i = 0; i < 10; i++)
    {
        int inner = i;
        methods[i] = delegate
        {
            Console.WriteLine("outer = {0}", outer++);
            Console.WriteLine("i = {0}", i);
            Console.WriteLine("inner = {0}", ++inner);
        };
        methods[i]();
    }
    for (int j = 0; j < methods.Length; j++) methods[j]();
}

編譯器產生偽代碼


class __LocalsDisplayClass$00000008 { public int outer; }
class __LocalsDisplayClass$0000000a { public int i; }
class __LocalsDisplayClass$0000000c
{
    public int inner;
    public __LocalsDisplayClass$00000008 $locals$00000009;
    public __LocalsDisplayClass$0000000a $locals$0000000b;
    public void __AnonymousMethod$00000007() { ... }
}

Delphi.NET 對比

Delphi.NET 嵌套函數採用參數傳遞方式:將上層變數放入自動產生的 Record,作為參數傳給內層函數,較簡單,因無複雜生命週期管理需求。


type $Unnamed1 = record Name: string; end;
procedure @1$SayHello$Say(var UnnamedParam: $Unnamed1);
procedure SayHello; var Unnamed1: $Unnamed1; begin Unnamed1.Name := Name; Say(Unnamed1); end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved