1. ホーム
  2. c#

[解決済み】C#でif/elseとswitch-caseを使うことに大きな違いはあるのでしょうか?

2022-04-01 06:51:25

質問

を使用するメリット/デメリットは何ですか? switch ステートメントと if/else をC#で作成します。 コードの見た目以外に、それほど大きな違いがあるとは思えません。

出来上がったILや関連する実行時のパフォーマンスが根本的に異なる理由はあるのでしょうか?

関連する switch on string と elseif on type はどちらが速いですか?

解決方法は?

SWITCH文は、デバッグモードや互換モードでは、IFと同じアセンブリしか生成されません。リリースでは、(MSILのswitch文を通して)ジャンプテーブルにコンパイルされます - これはO(1)です。

C#は(他の多くの言語と異なり)文字列定数のスイッチも可能ですが、これは少し異なる動作をします。任意の長さの文字列に対してジャンプテーブルを作成するのは明らかに現実的ではないので、ほとんどの場合、このようなスイッチはIFのスタックにコンパイルされます。

しかし、条件の数がオーバーヘッドをカバーできるほど大きい場合、C#コンパイラはHashTableオブジェクトを作成し、そこに文字列定数を入力し、そのテーブルを検索してジャンプを実行します。ハッシュテーブルの検索は厳密にはO(1)ではなく、定数コストが顕著ですが、ケースラベルの数が多ければ、IFで各文字列定数と比較するよりも大幅に高速になります。

まとめると、条件の数が5つ以上ある場合はIFよりもSWITCHを、そうでない場合は見栄えの良いものを使うということです。