お久しぶりです。THです。
2回目の投稿ということで、何を投稿しようかといろいろ考えたんですが、今日はプログラマーならだれでも使うif文とswitch文について書きたいと思います。
初めてプログラムを習ったときを思い出しますね。大体の人はif文のほうが良く使っているんじゃないでしょうか。
実際に業務で使用しているとswitch文にしておけばよかった!なぜここはswitch文じゃないんだ!と思うことがあったのでそれについて書きたいと思います。(あくまで個人の感想です。)
その前に、一応さらっとどういったものか確認しておきましょう。
if文とswitch文について
if文とswitch文どちらも分岐処理で使われる関数です。
if文の書き方ですと、
if ( 条件式A ){ 処理A; } else if ( 条件式B ){ 処理B; } else { 処理C; }
となり、switch文だと、
switch( 条件式 ){ case A: 処理A; break; case B: 処理B; break; default: 処理C; }
で書きます。書き方が違うだけで、結果はどちらも同じになります。
ソースコードの使い分け
ソースを見てわかるように、if文は多岐分岐になると条件式を毎回入れる必要があり、switch文については、一回の文の中で比較する条件は1つだけとなります。
では、具体的にどのような時、if文を使い、switch文を使えばよいのだろう。
例えば、「箱の中にりんご・ばなな・もも・みかんの中のどれか一つが入ってるとします。箱の中身を確認して果物によって処理が違う」という内容をif文とswitch文で書いてみます。
string sHako; sHako = "orange"; if ( sHako == apple ){ Console.WriteLine("りんごの処理"); } else if ( sHako == banana ){ Console.WriteLine("バナナの処理"); } else if ( sHako == peach ){ Console.WriteLine("ももの処理"); } else if ( sHako == orange ){ Console.WriteLine("みかんの処理"); }
string sHako; sHako = "orange"; switch( sHako ){ case apple: Console.WriteLine("りんごの処理"); break; case banana: Console.WriteLine("バナナの処理"); break; case peach: Console.WriteLine("ももの処理"); break; case orange: Console.WriteLine("みかんの処理"); break; }
出力される結果はどちらも同じですが、処理ではどう違うのかわかりますか。
実は、if文ではsHakoの中身を4回比較していますが、switch文では1回のみ比較しています。
そのため、多岐分岐の条件だとswitch文のほうが速くなります。
まとめ
現在のPC状況ですと速度はあまり変わらないかもしれませんが、無駄のない処理を目指すのであれば、上記のようなif文をswitch文に置き換えると良いかもしれません。
ただ、既存のソースコードを直すのであれば、修正前後の処理の違いでバグを作ってしまうこともあるので注意が必要です。
今回は実測しておりませんが、下記サイトにて、同様の結果がでています。
「Speed Test: Switch vs If-Else-If」<http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx> (2018年4月26日アクセス)
The results show that the switch statement is faster to execute than the if-else-if ladder. This is due to the compiler’s ability to optimise the switch statement. In the case of the if-else-if ladder, the code must process each if statement in the order determined by the programmer. However, because each case within a switch statement does not rely on earlier cases, the compiler is able to use branch tables in such a way as to provide the fastest execution.