为了说明我的困惑,请看下面的例子:
int a = 0;
Action act = () => ++a;
act();
Console.WriteLine(a);
我很难弄清楚在 lambda 中修改捕获的变量可能会如何影响局部变量 a
。首先,隐式生成的 lambda 函数对象无法存储对局部变量 a
的引用。否则,如果稍后返回并调用 act
,则引用的局部变量 a
将已经消失。这个问题的解决方案是按值复制,通过直接复制 int
值或通过装箱,这样函数对象就会有自己的副本局部变量 a
。但这并不能解释刚才给出的例子。那么,底层机制是什么?会不会是看似局部变量a
实际上不再是局部变量,而是被编译器翻译成对生成的lambda函数对象中的int
字段的引用?
最佳答案
这里的重点是closure .编译后 a
不再是局部变量 - 它是自动生成类的一个字段,无论是在函数范围还是在 lambda 中。
关于c# - 关于 C# lambda 中值捕获的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567683/