来自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/