C# 入門

ホーム > C# の基礎 > switch 文

switch 文

C# の switch 文に関する注意点について記載します。

switch 文は、ある変数の値によって処理を分岐させるのに使います。

処理の分岐自体は if 文でも可能ですが、分岐後の処理が少なく、かつ、分岐の数が多い場合に好んで使われているように思います。

例えば次の例では変数 i を評価して、その値が 1 のとき (case 1)、2 のとき (case 2)、その他の場合 (default) という風に場合分けされます。 そしてそれぞれの場合に応じた文字が出力されています。

上記のコードでは i は明らかに 1 なので、実行結果として "Good morning!" と出力されています。

スクリーンショットの開発環境は MonoDevelop です。Linux でも使えるので便利です。

詳細は「Linux (Ubuntu) で C# の IDE を利用する方法 ~ MonoDevelop をインストール」をみてください。

評価される値は整数型 (int, long 等)、char、string、enum が使えます。

さて C# で注意が必要なのは、フォールスルー (fall through) に関わるところです。 フォールスルーは case による分岐で処理を行った後、次の case の処理を行うことを言います。

C# ではフォールスルーができないことになっています。

ちなみに C 言語ではフォールスルーができました。 C 言語で上記と同様のことをやろうとして、 case 1 内の break を書き忘れたとします。

/* 注: これは C# ではなく C です。 */
#include <stdio.h>

int main() {
	int i = 1;
	switch(i){
	case 1:
		printf("Good morning!\n");
		/* break; */
	case 2:
		printf("See you!\n");
		break;
	default:
		printf("Hi!\n");
		break;
	}
	return 0;
}

これを実行すると、次のように case 1 の内容を処理してから、 case 2 の内容までフォールスルーしてしまい、次のようになります。

Good morning!
See you!

このようなバグは実行時にソッと発生するので見つけにくいことで知られていました。 このため C# ではフォールスルーは禁止され、コンパイル時にエラーが発生するようになりました。

C# で break を書き忘れると、次のようにコンパイル時にエラーになります。

言語的に禁止されているわけですから、この手の不具合は完全にシャットアウトされてありがたいことはありがたいですね。

尚、case ラベルの後に処理が無い場合は、case を複数並べることは可能です。

上記の例では case 1, case 2 を並べていますが、問題なく実行できます。

また C# 7.0 では case ラベルでパターンを利用できるようになりました。 パターンについては「パターン」をみてください。

ホーム > C# の基礎 > switch 文