当一个变量关闭两次时,它存储在哪里?
我正在阅读有趣的这篇名为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
的值,并且这两个方法将分别对应于您的两个匿名方法。