C#のswitch文は条件に合致したcaseラベルに処理を移す制御構造です。
通常、各caseブロックの最後にはbreakステートメントが入りますがこれを省略した場合どのような動作をするのか理解しておくことが重要です。
switch文の基本構文
まず、switch文の基本的な構文を確認しましょう。
switch (expression)
{
case value1:
// 処理1
break;
case value2:
// 処理2
break;
// 他のcase
default:
// 上記いずれのcaseにも一致しない場合の処理
break;
}
上記のように、各caseブロックの最後には通常breakステートメントがあります。
これは、該当するcaseラベルに入ったらその後のcaseラベルやdefaultまで処理を実行せずにswitch文から抜けるためです。
breakを省略した場合の動作
breakステートメントを省略した場合、該当するcaseの処理が終わった後も、
次のcaseやdefaultの処理が順次実行されます。
これを「fall-through」と呼びます。
switch (day)
{
case "Saturday":
Console.WriteLine("It's a holiday!");
// break; // breakがないため、次のcaseに進む
case "Sunday":
Console.WriteLine("It's a weekend!");
break;
default:
Console.WriteLine("It's a weekday.");
break;
}
上記の例では、dayが”Saturday”の場合、”It’s a holiday!”と”It’s a weekend!”が出力されます。
つまり、case “Sunday”:の処理も実行されるのです。
fall-throughを活かした使い方
フォールスルー(fall through)を敢えて使う場面もあります。
例えば、同じ処理を複数のcaseで行いたい場合などです。
switch (fruit)
{
case "Apple":
case "Pear":
case "Banana":
Console.WriteLine("It's a common fruit.");
break;
case "Pineapple":
case "Mango":
Console.WriteLine("It's a tropical fruit.");
break;
default:
Console.WriteLine("Unknown fruit.");
break;
}
上記の例では、”Apple”、”Pear”、”Banana”に該当する場合、共通のメッセージが表示されます。
同様に、”Pineapple”と”Mango”に該当する場合も、共通のメッセージが表示されます。
ここでfall-throughを利用することで冗長なコードを避けつつ効果的に処理を記述することができます。
まとめ
switch文でbreakを省略した場合fall-throughが発生し次のcaseやdefaultの処理が実行されます。
これを利用することでコードをシンプルに記述できる場合もありますが、注意が必要です。
明示的なbreakがないことでバグの原因となる可能性があるため意図的に使用する際は十分なコメントやドキュメンテーションを心がけましょう。