そういう事情から、前後のエントリーとの関連性や連続性はほとんどありません。
というわけで、今回のテーマは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と言っても、某ゲーム機の話と勘違いされちゃうと申し訳ないので・・・