c# - C# 中的内联辅助方法

标签 c# lambda inline

来自this answer我了解到可以强烈建议在 C# 中进行内联,如下所示:

using System.Runtime.CompilerServices; 

[MethodImpl(MethodImplOptions.AggressiveInlining)]
bool MyCondition() { return someObject != null && someObject.Count > 2; }

在当前项目中,我们使用 Appccelerate StateMachine 定义的状态机框架,这会产生如下所示的序列(在我们的项目中要长得多):

fsm.In(States.A)
   .On(Events.B)
      .If(arguments => false).Goto(States.B1)
      .If(() => someVariable && somethingElse == false).Goto(States.B3);
      .If(MyCondition).Goto(States.B2)

为了简化这些结构,我想将 lambda 表达式(或 Action 委托(delegate))分离为辅助方法(即最后一条语句)。这样做的原因是,使用正确的方法名称可以提高代码的可读性,其次,在自动生成文档时,它将使用方法名称而不是不直观的 [anonymous] 文本。

然而,问题是使用 AggressiveInlined 是否有任何意义,或者 JIT/编译器是否会自动内联涉及最多 4 个带有简单比较运算符的变量的简单 lambda 表达式?

我的直觉是内联这些方法,因为我相信状态机的不同部分会得到很多点击,因此减少方法调用将是一个好处。但话又说回来,JIT/编译器自动执行此操作有多聪明?

最佳答案

问题在于您对 C# 中的 lambda 理解不正确。当编译器将 c# 转换为 MSIL 时,lambda 就变成了类,因此您无需内联任何内容。你可以看看很棒Marc Gravell post on SO 。因此,无论您是否在外部类中定义 lambda,您都需要从堆中获取一个对象(我简化了编译后的代码行为)。因此,正如我认为的,您的应用程序的性能不会有任何差异。

关于c# - C# 中的内联辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238508/

相关文章:

c# - 在没有单元测试框架的情况下使用 Specflow

c# - 如何在 C# 中检测显示器上像素的颜色?

java - 如何在没有 if 构造的情况下引发异常

java - 打印低于阈值的动物总数

c# - 列名中带有前缀的简洁 map

c# - 按进程获取文件名

c++ - 删除 lambda 赋值运算符的基本原理?

performance - Oracle 10g 小 Blob 或 Clob 没有被内联存储?

css - 简单的 CSS : How to fix display:inline issue

jquery - 在不使用 $.GET 的情况下在 HTML 中内联 SVG