class EvilEvilEvilCapturedVariables
{
static void Main()
{
MethodInvoker[] delegates = new MethodInvoker[2];
int outside = 0; //只实例化一次
for (int i=0; i < 2; i++)
{
int inside = 0; //每次循环迭代,都要实例化一次 实例化很多次
delegates[i] = delegate //使用匿名方法捕获变量
只是创建,并没执行 outside变量两个委托共享 inside变量各自分配
{
Console.WriteLine ("({0},{1})",
outside, inside);
outside++;
inside++;
};
}
MethodInvoker first = delegates[0]; //委托0
MethodInvoker second = delegates[1]; //委托1
first(); //执行委托 inside 和 outside都是0 捕获的outside=1 inside=1
first(); //执行委托 outside 和 inside 都是1 执行完outside=2 inside=2
first(); //执行委托 outside 和 inside 都是2 执行玩 outside=3 inside=3
second(); //outside=3保留了 inside=0重新初始化 执行完 outside =4 inside=1
second(); //outside=4 保留 inside=1 保留 执行玩outside=5 inside =2
}
}
编译器如何实现 生成一个额外的类,包含外部变量 outside,还生成一个额外的类,包含内部变量(inside)和对第一个额外的类的引用。就是一个inside变量,一个outside变量的指针
输出
(0,0)
(1,1)
(2,2)
(3,0)
(4,1)