2013-03-14 80 views
9

那么我正在通过'Lambda表达式'主题(第17章;代表,代表C#语法糖)。杰弗里指出,C#编译器具有以下后台创建一个新的非静态类:Lambda表达式:编译器行为

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

我有以下两个问题:

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

  2. 为什么发出的类需要非静态时,静态类完全可以做到这一点?

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

让我知道是否需要提供更多的细节。

回答

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方法内创建一个新对象。

+0

很棒的回答。谢谢。 – astraldust 2013-03-14 10:29:40

+0

不客气,欢呼声。 – Freeman 2013-03-14 10:30:11