每個不同區域變數作用域產生一個封裝類別,子作用域封裝類別引用父作用域封裝類別實例,相同作用域變數與匿名方法綁定在同一封裝類別,維持一致生命週期。
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 嵌套函數採用參數傳遞方式:將上層變數放入自動產生的 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;