C# 如果启用了优化,JIT是否总是内联此方法? 我不期望有一个明确的“是”或“否”。任何你可能知道的知识,我都会把它当作答案。 private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate) { return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C"); } private String CalculateCharge(可空票据,可空利率) { 收益率((0.0百万美元的账单)*(0.0百万美元的利率)).ToString(“C”); }

C# 如果启用了优化,JIT是否总是内联此方法? 我不期望有一个明确的“是”或“否”。任何你可能知道的知识,我都会把它当作答案。 private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate) { return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C"); } private String CalculateCharge(可空票据,可空利率) { 收益率((0.0百万美元的账单)*(0.0百万美元的利率)).ToString(“C”); },c#,jit,heuristics,inline-method,C#,Jit,Heuristics,Inline Method,内联是JIT的实现细节,而不是C#编译器的实现细节。发件人: JIT使用许多启发式方法来 决定是否应使用某个方法 排成一行。 下面是一个列表 其中更重要的(注 这并非详尽无遗): 大于32字节IL的方法将不会内联 虚拟函数不是内联的 具有复杂流量控制的方法将不在列表中。复杂的 流量控制是指任何其他流量控制 比如果/那么/否则;在这种情况下,, 切换或同时切换 不支持包含异常处理块的方法 内联的,尽管 例外情况仍然存在 内联 如果该方法的任何形式参数是结构,则该方法将 不能内联。 虽然您的方法

内联是JIT的实现细节,而不是C#编译器的实现细节。发件人:

JIT使用许多启发式方法来 决定是否应使用某个方法 排成一行。 下面是一个列表 其中更重要的(注 这并非详尽无遗):

  • 大于32字节IL的方法将不会内联
  • 虚拟函数不是内联的
  • 具有复杂流量控制的方法将不在列表中。复杂的 流量控制是指任何其他流量控制 比如果/那么/否则;在这种情况下,, 切换或同时切换
  • 不支持包含异常处理块的方法 内联的,尽管 例外情况仍然存在 内联
  • 如果该方法的任何形式参数是结构,则该方法将 不能内联。
虽然您的方法很短,也不是很复杂,因此可能与启发式方法相匹配,
Nullable
是一个
struct
,所以我猜您的方法不是内联的

根据经验,如果内联此方法提高了性能,JIT将内联此方法;否则就不会。但这实际上是JIT的一个实现细节,您不应该为此编写代码:

<>我将强烈地考虑对这些试探性的< <强> >进行编码,因为它们可能会在JIT的未来版本中发生变化。不要为了保证方法是内联的而牺牲方法的正确性


编辑:显然,没有内联的结构已经过时了;更新的信息可以在上找到。

对此很难说“是”,但由于它是私有的,我想是这样。C#编译器从不内联任何内容。有关C#编译器(而不是jit编译器)执行的优化的列表,请参阅我关于该主题的文章。谢谢Eric,看起来我有很多阅读要做。struct选项在.NET3.5sp1中不再正确。结构参数现在可以内联了。@Reed Copsey:谢谢你提供的信息。已证明的观点:)