C# - 文法など - switch

 クラウディア
1. 概要
2. 文字列が使える
3. fall through は使えない

1. 概要

 「C#」は、「C/C++」と同様の「switch」文が使えるのであるが、ずいぶんと趣が異なっています。  本ページは、下記のサイトを参考にさせていただきました。
switch文の危険な使い方」
「条件分岐 - C# によるプログラミング入門 | ++C++;

2. 文字列が使える

 少なくとも、わたしの知っている範囲では、「C」言語では、「case」に使えるのは、整数値だけですが、「C#」では、文字型も使えます。

List<string> list01 = new List<string>
	{
		"あは",
		"あひ",
		"あふ",
		"あへ",
		"あほ",
	};

foreach (string m in list01)
{
	switch (m)
	{
	case "あへ":
		Console.WriteLine(m +"うひは");
		break;

	default:
		Console.WriteLine();
		break;
	}
}
 上記のソースでロードモジュールを作成して、実行すると3行開業後に「あへうひは」と出力して、1行改行することになります。

3. fall through は使えない


List<int> list01 = new List<int>{ 1, 2, 3, 5, 5, 6, };

foreach (int item in list01)
{
	switch (item)
	{
	case 1:
		Console.WriteLine("["+ item +"] は 1なのよ");

	case 2:
	case 3:
		Console.WriteLine("["+ item +"] は 1~3 のいずれかなのよ");
		break;

	default:
		Console.WriteLine("["+ item +"] は 1~3 の中にないのよ");
		break;
	}

}
 これ、コンパイルすると

error CS0163: Control cannot fall through from one case label `case 1:' to another
エラー	13	コントロールはひとつの case ラベル ('case 1:') から別のラベルへ流れ落ちることはできません。
 てな、エラーになります。  フォールスルー「fall through」ってやつです。  参考サイトでは、ひどいコーディングの代表のように書かれていますが、システムによっては、効果を発揮するんですけどね。  まぁ、「猫」だったり「猿」だったりがコーディングするとひどいものになるのでしょう。  これを、避けるこすい技として、「goto」が使えます。  すなわち

List<int> list01 = new List<int>{ 1, 2, 3, 5, 5, 6, };

foreach (int item in list01)
{
	switch (item)
	{
	case 1:
		Console.WriteLine("["+ item +"] は 1なのよ");
		goto label1_3;

	case 2:
	case 3:
	label1_3:
		Console.WriteLine("["+ item +"] は 1~3 のいずれかなのよ");
		break;

	default:
		Console.WriteLine("["+ item +"] は 1~3 の中にないのよ");
		break;
	}

}
 これでロードモジュールを作成して、実行すると下記の結果が得られます。

[1] は 1なのよ
[1] は 1~3 のいずれかなのよ
[2] は 1~3 のいずれかなのよ
[3] は 1~3 のいずれかなのよ
[5] は 1~3 の中にないのよ
[5] は 1~3 の中にないのよ
[6] は 1~3 の中にないのよ
earthcar(アースカー)
損保との違い