- 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 の中にないのよ
|