C#でプログラムを書くとき、繰り返し処理(ループ)はとても重要な要素の一つです。例えば、配列の要素を順番に処理したり、一定の条件を満たすまで処理を繰り返したりする場面でよく使われます。
しかし、すべての繰り返し処理が最後まで実行されるとは限りません。途中で特定の条件を満たしたときにループを抜けたい場合もあります。例えば、次のようなケースです。
- ユーザーの入力が特定の値になったら処理を終了する
- 必要なデータが見つかった時点でループを抜ける
- 無限ループの安全対策として途中で抜ける仕組みを用意する
C#では、ループを途中で抜ける方法がいくつかあります。本記事では、break
、return
、throw
を使った方法を紹介し、それぞれの特徴や使いどころを解説します。
それでは、具体的な方法を見ていきましょう!
breakを使う方法
C#で最も一般的に使われるループの途中終了方法がbreak
です。
break
を使うと、ループの実行中に特定の条件を満たした場合、即座にループを抜けることができます。
基本的な使い方
break
は for
、while
、do-while
、foreach
などのループ内で使用できます。
以下のコードは、for
ループ内で break
を使って、i
が 5
になった時点でループを終了する例です。
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break; // iが5のときにループを抜ける
}
Console.WriteLine(i);
}
Console.WriteLine("ループ終了");
出力結果
0
1
2
3
4
ループ終了
このように、i == 5
の条件を満たした時点で break
によりループが中断され、5
以降の数値は出力されません。
break
は一番内側のループだけを終了します。ネストされたループ全体を抜けたい場合は、return
や goto
などの別の方法を使う必要があるという点に注意しましょう。
returnを使う方法
return
を使うと、ループを抜けるだけでなく、そのループを含むメソッド自体の処理を終了することができます。
そのため、メソッドの途中で処理を打ち切りたい場合に適した方法です。
基本的な使い方
次のコードでは、for
ループの中で return
を使い、i == 5
のときにメソッド全体を終了させています。
void SampleMethod()
{
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
Console.WriteLine("ループを抜けてメソッドを終了します");
return; // メソッド自体を終了する
}
Console.WriteLine(i);
}
Console.WriteLine("この行は実行されません");
}
SampleMethod();
Console.WriteLine("メソッドが終了しました");
出力結果
0
1
2
3
4
ループを抜けてメソッドを終了します
メソッドが終了しました
return
が実行された時点で SampleMethod()
の処理が終了するため、"この行は実行されません"
というメッセージは表示されません。
returnを使うケース
- ループを抜けるだけでなく、メソッド全体の処理を終了したい場合
- 早期リターン(不要な処理を省略し、処理を素早く終わらせる)を行いたい場合
例えば、特定の条件を満たしたときにメソッド全体の実行を終了するケースを考えてみましょう。
void CheckNumber(int num)
{
if (num < 0)
{
Console.WriteLine("負の数が入力されたため処理を終了します");
return;
}
Console.WriteLine($"入力された数値: {num}");
}
CheckNumber(5);
CheckNumber(-3);
CheckNumber(10);
出力結果
入力された数値: 5
負の数が入力されたため処理を終了します
入力された数値: 10
num
が負の値のときは return
によって処理が打ち切られ、それ以降のコードが実行されません。
return
を使えば、ループを抜けるだけでなく、メソッド全体を終了できるため、特定の条件で早めに処理を打ち切りたい場合に便利です。
次は、あまり使われることはないですが、goto
を使ってループを抜ける方法について解説します。
throw を使う方法(例外を使用)
C#では、throw
を使って例外を発生させることでループを強制的に終了することもできます。
ただし、例外処理は 異常な状態を検出したときに使うべきものであり、通常のループの終了には適していません。
適切に try-catch
を活用しないと、プログラムの動作が意図しないものになる可能性があるため注意が必要です。
基本的な使い方
以下のコードでは、i == 5
のときに throw
を使って例外を発生させ、ループを強制終了しています。
その後、catch
ブロックで例外を処理し、適切なメッセージを表示します。
try
{
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
throw new Exception("ループを抜ける");
}
Console.WriteLine(i);
}
}
catch (Exception ex)
{
Console.WriteLine($"例外発生: {ex.Message}");
}
出力結果
0
1
2
3
4
例外発生: ループを抜ける
i == 5
になった時点で例外が発生し、catch
ブロックに処理が移るため、それ以降のループは実行されません。
throw を使うケース
- 異常な状態が発生したときにループを終了し、適切にエラーハンドリングを行いたい場合
- 無限ループや想定外の入力から抜け出す手段として利用する場合
- 正常なループ制御(
break
やreturn
など)では対応できないケース
たとえば、ユーザーが無効な入力をした場合に throw
を使って処理を中断する例を見てみましょう。
void ProcessNumbers(int[] numbers)
{
foreach (int num in numbers)
{
if (num < 0)
{
throw new ArgumentException("負の数が含まれています");
}
Console.WriteLine(num);
}
}
try
{
int[] data = { 1, 2, -3, 4, 5 };
ProcessNumbers(data);
}
catch (ArgumentException ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
出力結果
1
2
エラー: 負の数が含まれています
この例では、負の数が見つかった時点で throw
により例外が発生し、ループを強制終了しています。
throw を使う際の注意点
- 通常のループ制御には使用しない(
break
やreturn
の方が適切) - 例外を適切にキャッチ(
catch
)することが重要(しないとプログラムがクラッシュする) - パフォーマンスの観点からも、頻繁に
throw
を使うのは避けるべき(例外処理は比較的重い処理)
まとめ
本記事では、C#でループを途中で抜ける方法を4つ紹介しました。それぞれの方法には適した使いどころがあります。
どの方法を使うべき?
- 通常のループ終了なら
break
を使うのが基本 - メソッド全体を終了したいなら
return
が便利 - 異常時の処理には
throw
を活用するのが適切
適切な方法を選ぶことで、コードの可読性と保守性を向上させることができます。
ループを抜ける際には、その処理がどのような影響を与えるのかを考え、最適な方法を選びましょう!
コメント