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

我正在阅读有趣的这篇名为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存储在哪里?


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

链接地址: http://www.djcxy.com/p/51553.html

上一篇: When a variable is closed twice, where is it stored?

下一篇: Reusing lambda expression