そういう事情から、前後のエントリーとの関連性や連続性はほとんどありません。
というわけで、今回のテーマはswitch文です。条件分岐の条件が多岐にわたる場合、if-elseで書くよりもswitchで書いた方がスッキリとした記述になりますね。
switch
using System; namespace sample3 { class Program { static void Main(string[] args) { string s = "hello"; switch (s) { case "ok": Console.WriteLine("OK!"); break; case "hello": Console.WriteLine("Hi"); break; case "bye": Console.WriteLine("good bye..."); break; default: Console.WriteLine("???"); break; } } } }swich(s)から後ろがswitch文に当たります。このswitch文はCやC++にもあります。しかし、このリストのswitch文はCやC++では間違いです。コンパイルエラーになります。なぜなら、switch(式)で評価される式は、CやC++では整数型変数でなければならないからです。
しかし、C#ではこのswitchの文法が拡張されていて、整数型以外に文字列型を扱えるようになりました。
ですから、C# では正常にコンパイルできますし、書かれている印象どおりの動作をします。
上記リストだと、string型の変数sに"hello"を代入してからswitchで評価しているので、case "hello"のラベルにある処理が実行され、コンソールに"Hi"と表示されます。
ところで、Cでは、case文の後の処理の終わりにbreakを書かないことが許されていて、書かない場合は次のcase文の処理が実行されることになっていました。これをフォールスルーというそうです。C#ではこのフォールスルーが禁止され、breakを書き忘れるとコンパイルエラーになります。
フォールスルーさせたい場合は、goto case〜と、明示的にジャンプさせなければなりません。
フォールスルーは便利ではありますが、バグの原因にもなります。何度もやらかした経験があります。
なお、switch(式)の式が整数型でなければならないC/C++でも、enum(列挙型)を使って、プログラムを読みやすくする、という手法があるそうです。このサイトを読んで知りました。
typedef enum date { sunday, monday, tuesday, wednesday, thursday, friday, saturday } DATE; DATE day = monday; switch (day) { case sunday : case saturday : printf( "holiday\n" ); break; case monday : printf( "swimming\n" ); break; case tuesday : case thursday : printf( "play with friend\n" ); break; case wednesday : printf( "piano lesson\n" ); break; case friday : printf( "football class\n" ); default : printf( "illegal data\n"); } }
たしかに直感的に分かるようになりますね。これをmainに組み込んで実行すると、mondayに対応するswimmingが表示されます。
それでは今回はこれで終わりです。
タイトルを若干変えました。switchと言っても、某ゲーム機の話と勘違いされちゃうと申し訳ないので・・・