Lambda表达式:编译器行为

时间:2013-03-14 09:10:52

标签: c# lambda

我正在阅读'Lambda表达式'主题(第17章;代表,C#代表语法糖)。 Jeffery声明C#编译器在后台创建了一个新的非静态类,它具有以下内容:

  1. 用于存储已在Lambda Expression中访问的所有局部变量的字段。
  2. 一种方法,其正文包含Lambda表达式,其签名/返回类型与已使用Lambda Expressin的委托相匹配。
  3. 我有以下两个问题:

    1. 我自己做了一点调试,看到如果Lambda Expression修改了局部变量的值(在lambda Expresison正在使用的方法中定义),新值也会反映在表达式主体之外。考虑到表达式实际上是在另一个类中,这怎么可能呢?

    2. 为什么在静态类完全相同的情况下,发出的类需要是非静态的?

    3. 我希望这不是一个我无法理解的非常简单的概念。

      如果我需要提供更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:5)

首先,我几天前有一个类似的问题。

Closure captured variable modifies the original as well

第二,使它成为静态类有什么意义?无论如何只创建了一个对象,并且该对象不必在整个应用程序生命周期中存活。

the new value is reflected outside the expression body too. How is this possible considering the expression is actually in a different class.

问题是anonymus方法引用了同一个对象,以及anonymus方法之外的局部变量,所以你改变它的地方并不重要,你改变了同样的事情。

此外,Tim Goodman在我链接的问题中提供的答案,通过在anonymus方法中创建一个新对象,向您展示如何做,以避免变化在任何地方反映出来。