我正在阅读有趣的文章,名为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
确切存储在哪里?
答案 0 :(得分:3)
该方法只有一个闭包类,而不是每个匿名方法一个。那个一个类将有两个实例方法和一个字段。该字段将存储i
的值,并且这两个方法将分别对应于您的两个匿名方法。