9

好吧,我正在讨论“Lambda 表达式”主题(第 17 章;代表,代表的 C# 语法糖)。Jeffery 指出 C# 编译器会在后台创建一个新的非静态类,该类具有以下内容:

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

我有以下两个问题:

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

  2. 当静态类可以完美地完成同样的事情时,为什么发出的类需要是非静态的?

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

如果我需要提供更多详细信息,请告诉我。

4

1 回答 1

5

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

闭包捕获的变量也会修改原始变量

其次,将其设为静态类有什么意义?无论如何,只会创建一个对象,并且该对象不必在应用程序的整个生命周期中都存在。

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

问题是匿名方法以及匿名方法外部的局部变量都引用了同一个对象,因此无论您从哪里更改它都无关紧要,您更改的是相同的东西。

此外,蒂姆古德曼在我链接到的问题中提供的答案向您展示了如何通过在您的匿名方法中创建一个新对象来避免更改无处不在。

于 2013-03-14T09:14:13.550 回答