C#のswitch文にbreakが必要な理由

【背景】

switch 文は C 言語ファミリーの構文を引き継いでいて、C/C++ から来ています。

C 言語の switch は

switch (x) {
    case 1:
        printf("1です");
    case 2:
        printf("2です");
}

のように書くと、条件に一致したところから下の case にも流れてしまう

これを フォールスルー(fall-through) と言います。


【なぜフォールスルーがあった?】

  • もともと switch はアセンブリ言語のジャンプテーブル的な使い方が想定されていました。
  • break を入れないことで「複数のケースをまとめて処理」できる柔軟性があったんです。

例:

switch (x) {
    case 1:
    case 2:
    case 3:
        printf("1〜3のいずれかです");
        break;
}

こうすると 1, 2, 3 どれでも同じ処理ができる。

これを便利だとしたので、フォールスルーが仕様に残りました。


【C# でも同じ仕様にした理由】

  • C# は C/C++/Java から来たプログラマーに違和感がないように、switch のフォールスルー仕様を踏襲。
  • case の後に処理を書いたら break を忘れないようにルール化されました。
  • Java も同じ仕組みです。

【C# ではフォールスルー禁止の方向に】

ただし C# では フォールスルーを原則禁止 しており:

  • case は次の case に勝手に流れないようにコンパイルエラーになります。
  • break か return などで必ずブロックを抜ける必要があります。

例外的に:

case 1:
case 2:
    // これは OK(処理なしのフォールスルー)
    Console.WriteLine("1 または 2");
    break;

のように「ラベルだけ渡す」のはOK。


【まとめ】

✅ switch の break は

  • フォールスルー防止のため
  • 複数条件でまとめる柔軟性を残すため
  • C 言語の歴史的経緯で生まれた

✅ C# は安全にするために

  • 意図しないフォールスルーは禁止
  • break 必須

という経緯で break が必要になった、というわけです。

訪問数 11 回, 今日の訪問数 3回

C#,条件式

Posted by hidepon