从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 /编译器自动执行此操作有多聪明?
答案 0 :(得分:2)
问题是你不正确地理解c#中的lambdas。当编译器将c#转换为MSIL时,lambdas会成为类,因此您无需内联。你可以看一下很棒的Marc Gravell post on SO。因此,无论您是否在外部类中定义lambdas,您都需要从堆中获取对象(我简化了编译的代码行为)。因此,正如我认为的那样,应用程序的性能没有差别。
答案 1 :(得分:1)
还要记住,状态机将委托保留在其内部数据结构中。警卫行动不能在那里内联。
唯一可能的事情是内联辅助方法调用的方法。