【问题标题】:Confusion about value capturing in C# lambda关于 C# lambda 中的值捕获的困惑
【发布时间】: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 我知道。真正的问题是:第一行的aint 类型的局部变量,还是只是对作为内部类实例的生成的lambda 函数对象的int 字段的引用?
  • @Lingxi 查看转换后的代码。它将a 移动到一个新类中,当您编写Console.WriteLine(a) 时,它会将其转换为使用lambda 对象的a
  • 你最后一句话说的:a 不再是一个局部变量,而是这个新内部类的一个字段。

标签: c# lambda


【解决方案1】:

这里的重点是closure。编译后 a 不再是局部变量 - 它是自动生成的类的字段,无论是在函数范围内还是在 lambda 中。

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2012-03-26
    • 2014-11-29
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多