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 で代用できない場面で |
訪問数 15 回, 今日の訪問数 4回
ディスカッション
コメント一覧
まだ、コメントがありません