goto を使うべきとされる例

C# に限らず、goto は一般的には推奨されない構造ですが、「使ってもいい(むしろ他の構造より適している)場面」がいくつかあります。


1. switch 文の case 間のフォールスルー

C# の switch 文では、C言語のように case をフォールスルーさせるには goto case を使います。

switch (value)
{
    case 1:
        Console.WriteLine("Case 1");
        goto case 2;  // Case 2 にジャンプする
    case 2:
        Console.WriteLine("Case 2");
        break;
    default:
        Console.WriteLine("Default");
        break;
}

これは C# の switch では case をフォールスルーできない仕様だからです。

この用途では goto はむしろ必須。


2. 深いネストからの脱出(多重ループの途中抜け)

多重 for / while ループの中で、条件を満たしたときに一気に外側へ抜けたい場合。

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (someCondition)
        {
            goto ExitLoops;
        }
    }
}

ExitLoops:
Console.WriteLine("抜けた!");

▶︎ break は一番内側のループしか抜けないので、外側まで一気に抜けたい場合に便利。


3. エラー発生時のクリーンアップ(古典的なパターン)

昔のC言語スタイルの例外処理の代わりです。

C# では try-finally があるので、通常はそちらを使いますが、

低レベルでリソース管理が必要な状況(C# の unsafe コードやレガシー移植)では使われることがあります。

if (!InitStep1()) goto Cleanup0;
if (!InitStep2()) goto Cleanup1;
if (!InitStep3()) goto Cleanup2;

// 正常終了
return;

Cleanup2:
    ReleaseStep2();
Cleanup1:
    ReleaseStep1();
Cleanup0:
    return;

❌ goto を使わない方が良いケース

  • 単純なループは for や while を使う
  • 条件分岐は if-else を使う
  • 複雑な条件で分岐させたいならメソッドを分ける

🔑 ポイント

  • C# では goto は基本的には最後の手段です。
  • 「可読性が下がらないか?」を最優先で考えるのが大事。
  • 例外処理があるので、リソース解放やエラーハンドリングでは try-finally を優先。

まとめ

使っていい場合理由
switch-case のフォールスルーgoto case は C# では必要
多重ループからの一気脱出break では一段しか抜けられない
古典的なエラー処理のクリーンアップtry-finally で代用できない場面で

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

C#

Posted by hidepon