【发布时间】:2016-08-02 17:39:51
【问题描述】:
为了说明我的困惑,请看下面的例子:
int a = 0;
Action act = () => ++a;
act();
Console.WriteLine(a);
我很难弄清楚对 lambda 中捕获的变量的修改可能会如何影响局部变量 a。首先,隐式生成的 lambda 函数对象无法存储对局部变量 a 的引用。否则,如果 act 返回并稍后调用,则引用的局部变量 a 将已经消失。这个问题的解决方案是按值复制,或者直接复制int 值,或者通过装箱,这样函数对象就有自己的局部变量a 的副本。但这并不能解释刚刚给出的例子。那么,底层机制是什么?会不会看似局部变量a实际上不再是局部变量,而是被编译器翻译成对生成的lambda函数对象内的int字段的引用?
【问题讨论】:
-
but translated by the compiler to be a reference to an int field within the generated lambda function object?现场猜测 :) -
@Dennis_E 我知道。真正的问题是:第一行的
a是int类型的局部变量,还是只是对作为内部类实例的生成的lambda 函数对象的int字段的引用? -
@Lingxi 查看转换后的代码。它将
a移动到一个新类中,当您编写Console.WriteLine(a)时,它会将其转换为使用lambda 对象的a。 -
你最后一句话说的:
a不再是一个局部变量,而是这个新内部类的一个字段。