c#中的内联辅助方法

时间:2015-03-24 16:53:58

标签: 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委托)分成helper方法(即最后一个语句)。这样做的原因是,使用正确的方法名称可以提高代码的可读性,其次在自动生成文档时,它将使用方法名称而不是非直观的[anonymous]文本。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

还要记住,状态机将委托保留在其内部数据结构中。警卫行动不能在那里内联。

唯一可能的事情是内联辅助方法调用的方法。