c# - C# 编译器和虚拟机中如何处理 lambda 表达式?

标签 c# .net lambda clr

如何C#编译器和虚拟机(.NET 公共(public)语言运行时)句柄 lambdaC# 中发挥作用?它们通常被翻译成普通函数,但在编译器中被标记为某种意义上的“匿名”,然后被视为普通函数,还是有不同的方法?

最佳答案

它可能太宽泛了。也就是说,可以轻松提供一些基本信息:

  • 首先,“匿名”只是意味着您在您的代码中 没有可以引用该方法的名称。任何匿名方法,无论是使用较旧的 delegate 语法还是较新的 lambda 语法声明,最终仍会被编译为具有实际名称的方法到某个类(您自己的或新的类)中编译器为此目的创建……见下文)。您根本无权访问自己代码中的名称。除此之外,它基本上与任何其他方法一样。

  • 上述内容的主要异常(exception)是它将如何处理变量捕获。如果匿名方法捕获局部变量,则为此目的声明一个新类(也隐藏在您的代码中)并且该变量最终存储在类中而不是作为实际的局部变量,匿名方法当然会结束也是那个类(class)的。

  • 最后请注意,lambda 语法不仅用于匿名方法,还用于声明 Expression 类的实例。在那种情况下,一些处理是相似的,但当然您不会像处理匿名方法那样将类型编译到代码中。

正如其他人所建议的那样,如果您需要比这更多的细节,那么 StackOverflow 可能不是最好的答案(或者,如果它是最好的答案,肯定已经有人问过并回答过,您只是需要寻找答案)。您可以使用 ildasm.exe、dotPeek 等检查实际生成的代码,您可以阅读 C# 规范,或者您可以在网络上搜索其他详细信息。

关于c# - C# 编译器和虚拟机中如何处理 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27669894/

相关文章:

java - 在将文件解析为 Java 之前将 C# 中的文件转换为字节数组

c# - 将命令过滤器添加到 textview 后出现问题

c# - .Net 等效于 ScaleHeight 和 Scalewidth

c# - 如何在 LINQ Where() 中使用额外的 int 参数

java - 将 lambda 分配给功能接口(interface)变量 : inherited abstract method must be implemented. 时出错,为什么?

c# - 是否可以强制 Windows Phone 更新您的应用程序?

c# - 如何设置 ReSharper 默认公司和版权?

c# - 通过 ILMerge 合并 WCF 引用

.net - GDI + .NET : LinearGradientBrush wider than 202 pixels causes color wrap-around

java - 将 java lambda 转换为 pre java 1.8 函数