当变量关闭两次时,它存储在哪里?

时间:2017-02-15 19:31:13

标签: c# .net lambda closures

我正在阅读有趣的文章,名为C# Closures Explained,其中指出:

  

您可以看到,C#编译器会检测委托何时形成一个从当前作用域传出的闭包,它会将委托和关联的局部变量提升为编译器生成的类。这样,它只需要一些编译器技巧来传递编译器生成的类的实例,所以每次调用委托时我们实际上都是在这个类上调用方法。

因此,基本上闭合变量存储为匿名类的成员变量,该变量还包含表示lambda表达式的委托或其他关闭变量的代码。

如果是这种情况,当一个方法包含两个不同的lambda表达式并且它们都引用相同的局部变量时会发生什么?

void Test(IList list)
{
    int i = 0;

    list.Any( a => { Console.WriteLine("Lambda one says: {0}", i++); return true;} )
        .Any( a => { Console.WriteLine("Lambda two says: {0}", i++); return true;} );

}

我很确定我知道这里的行为。我的问题是,i确切存储在哪里?

1 个答案:

答案 0 :(得分:3)

该方法只有一个闭包类,而不是每个匿名方法一个。那个一个类将有两个实例方法和一个字段。该字段将存储i的值,并且这两个方法将分别对应于您的两个匿名方法。