Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda表达式:编译器行为_C#_Lambda - Fatal编程技术网

C# Lambda表达式:编译器行为

C# Lambda表达式:编译器行为,c#,lambda,C#,Lambda,我要讲的是“Lambda表达式”主题(第17章:代表,C#代表的语法糖)。Jeffery指出,C#编译器在后台创建一个新的非静态类,该类具有以下内容: 用于存储Lambda表达式中已访问的所有局部变量的字段 一种方法,其主体包含Lambda表达式,其签名/返回类型与已使用Lambda表达式的委托匹配 我有以下两个问题: 我自己做了一些调试,发现如果Lambda表达式修改局部变量的值(在Lambda Expresison正在使用的方法中定义),那么新值也会反映在表达式体之外。考虑到表达式实际上在不

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

  • 用于存储Lambda表达式中已访问的所有局部变量的字段
  • 一种方法,其主体包含Lambda表达式,其签名/返回类型与已使用Lambda表达式的委托匹配
  • 我有以下两个问题:

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

  • 为什么发出的类需要是非静态的,而静态类完全可以做到这一点

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


    如果我需要提供更多细节,请告诉我。

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

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

    新值也反映在表达式体之外。考虑到表达式实际上在不同的类中,这怎么可能呢。

    问题是,同一个对象同时被anonymus方法以及anonymus方法外部的局部变量引用,所以无论从何处更改它,都是更改同一个对象

    此外,Tim Goodman在我所链接的问题中提供的答案向您展示了如何通过在匿名方法中创建新对象来避免到处反映更改