我不期待肯定的是或否。你可能拥有的任何知识我都会考虑作为答案。
private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate)
{
return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C");
}
答案 0 :(得分:22)
内联是JIT的实现细节,而不是C#编译器的实现细节。来自Eric Gunnerson's blog:
JIT使用了许多启发式方法 决定方法是否应该 在内衬。 以下是一份清单 其中更重要的(注意 这不是详尽无遗的):
- 不会内联大于32字节IL的方法。
- 虚拟函数未内联。
- 具有复杂流量控制的方法不会内联。复杂 流量控制是其他任何流量控制 比if / then / else;在这种情况下, 切换或同时。
- 不包含异常处理块的方法 内联,虽然抛出的方法 例外仍然是候选人 内联。
- 如果方法的任何形式参数都是结构体,那么该方法将会 没有内联。
虽然您的方法非常简短而且不是很复杂,因此它可能与启发式方法相匹配,Nullable<T>
是struct
所以我猜你的方法没有内联。
根据经验,如果内联此方法可以提高性能,JIT将内联此方法;否则它不会。但这实际上是JIT的一个实现细节,你应该编写代码:
我会仔细考虑明确编写这些启发式,因为它们可能会在未来版本的JIT中发生变化。不要妥协方法的正确性,以保证它将被内联。
编辑:显然有关结构未被内联的内容已经过时了;更新的信息可以在Vance Morrison's blog找到。