Lambda表达式:编译器行为

ast*_*ust 9 c# lambda

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

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

我有以下两个问题:

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

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

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

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

Fre*_*man 5

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

Closure捕获变量也会修改原始变量

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

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方法中创建一个新对象,向您展示如何做,以避免变化在任何地方反映出来.