7

私は明確な「はい」または「いいえ」を期待していません。あなたが持っているかもしれないどんな知識でも、私は答えとして考えます。

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate)
{
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C");
}
4

1 に答える 1

23

インライン化は、C#コンパイラではなく、JITの実装の詳細です。エリックガンナーソンのブログから:

JITは、いくつかのヒューリスティックを使用して、メソッドをインライン化する必要があるかどうかを決定します。以下はそれらのより重要なリストです(これは網羅的ではないことに注意してください):

  • 32バイトを超えるILのメソッドはインライン化されません。
  • 仮想関数はインライン化されていません。
  • 複雑なフロー制御を持つメソッドはインライン化されません。複雑なフロー制御は、if / then/else以外のフロー制御です。この場合、またはwhileを切り替えます。
  • 例外処理ブロックを含むメソッドはインライン化されませんが、例外をスローするメソッドは依然としてインライン化の候補です。
  • メソッドの正式な引数のいずれかが構造体である場合、メソッドはインライン化されません。

あなたのメソッドは非常に短く、それほど複雑ではないので、ヒューリスティックと一致する可能性がありますNullable<T>が、そうなstructので、あなたのメソッドはインライン化されていないと思います。

経験則として、このメソッドをインライン化するとパフォーマンスが向上する場合、JITはこのメソッドをインライン化します。そうでなければ、そうではありません。しかし、これは実際にはJITの実装の詳細であり、コーディングする必要はありません。

これらのヒューリスティックは、JITの将来のバージョンで変更される可能性があるため、明示的にコーディングすることを慎重に検討します。メソッドの正確性を妥協して、インライン化されることを保証しようとしないでください。

編集:構造体がインライン化されていないことについてのビットは明らかに時代遅れです。更新された情報は、 VanceMorrisonのブログで見つけることができます。

于 2009-08-27T18:51:07.583 に答える