C# breakの使い方を徹底解説|for・while・switchの抜け方とcontinue・returnとの違い

はじめに

C#で繰り返し処理や条件分岐を書いていると、「途中で処理を止めたい」「条件を満たしたらループを抜けたい」という場面がよくあります。そのようなときに使うのがbreak文です。

breakは、for文、while文、do while文、foreach文、switch文などで使われ、現在実行中のループやswitch文を途中で終了させる役割を持ちます。

たとえば、1から10まで順番に処理するループがあったとしても、途中で目的の値が見つかったなら、それ以上繰り返す必要はありません。そのような場合にbreakを使うことで、無駄な処理を減らし、コードの意図もわかりやすくできます。

この記事では、C#のbreakの基本から、forwhileswitchでの使い方、continuereturnとの違い、よくあるエラーや実践的なサンプルまで、初心者にもわかりやすく解説します。

1. C#のbreakとは?処理を途中で抜けるための基本

1-1. breakの役割は「ループやswitchを終了する」こと

C#のbreakは、現在実行しているループやswitch文を途中で終了するための文です。

主に次のような場面で使います。

C#
for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}

Console.WriteLine(i);
}

このコードでは、i5になった時点でbreakが実行されます。そのため、画面には次のように表示されます。

C#
1
2
3
4

i == 5になった時点でループが終了するため、5以降は表示されません。

つまり、breakは「もうこの繰り返し処理は続けなくてよい」と判断したときに使う命令です。

1-2. breakが使える場所と使えない場所

breakはどこでも自由に使えるわけではありません。C#では、基本的に次のような場所で使えます。

C#
for文
while文
do while文
foreach文
switch文

たとえば、for文の中では次のように使えます。

C#
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
break;
}

Console.WriteLine(i);
}

一方で、単独のif文の中だけでは使えません。

C#
if (true)
{
break; // エラー
}

このコードはエラーになります。なぜなら、breakで抜ける対象となるループやswitch文が存在しないからです。

ただし、if文がループの中にある場合は使えます。

C#
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break;
}
}

この場合、breakif文を抜けるのではなく、外側のfor文を終了します。

1-3. breakを使うと処理の流れはどう変わるのか

breakが実行されると、その場でループやswitch文の処理が終了し、次の処理へ進みます。

C#
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}

Console.WriteLine("ループ中: " + i);
}

Console.WriteLine("ループ終了");

実行結果は次のようになります。

C#
ループ中: 1
ループ中: 2
ループ終了

i3になったとき、breakによってfor文が終了します。その後、for文の後ろにあるConsole.WriteLine("ループ終了");が実行されます。

つまり、breakはプログラム全体を終了するのではなく、現在のループやswitch文だけを終了します。

1-4. 初心者がまず押さえるべきbreakの考え方

初心者がbreakを理解するときは、次のように考えるとわかりやすいです。

breakは「ここで繰り返しをやめる」という合図です。

たとえば、配列の中から特定の値を探す処理を考えてみましょう。

C#
int[] numbers = { 10, 20, 30, 40, 50 };

for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == 30)
{
Console.WriteLine("30が見つかりました");
break;
}
}

30が見つかった時点で、残りの4050を調べる必要はありません。そのため、breakでループを終了しています。

このように、breakは「目的を達成したので処理を終える」「これ以上続ける必要がない」という場面で使うと効果的です。

2. C# breakの基本構文とシンプルな使い方

2-1. break文の基本構文

C#のbreak文の構文はとてもシンプルです。

C#
break;

breakの後ろにはセミコロンを付けます。

実際には、単独で書くのではなく、ループやswitch文の中で条件分岐と組み合わせて使うことが多いです。

C#
while (true)
{
if (条件)
{
break;
}
}

このように、if文で条件を判定し、その条件を満たしたときにbreakで処理を抜ける書き方が一般的です。

2-2. if文と組み合わせて特定条件で処理を抜ける

breakは、if文と一緒に使うことで真価を発揮します。

C#
for (int i = 1; i <= 10; i++)
{
if (i == 6)
{
break;
}

Console.WriteLine(i);
}

実行結果は次のとおりです。

C#
1
2
3
4
5

i6になった時点でbreakが実行されるため、6は表示されません。

もしConsole.WriteLine(i);breakの前に書くと、結果は変わります。

C#
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);

if (i == 6)
{
break;
}
}

この場合、実行結果は次のようになります。

C#
1
2
3
4
5
6

同じbreakでも、どの位置に書くかによって実行結果が変わるため注意しましょう。

2-3. break後に実行される処理の確認

breakが実行されると、ループ内の残りの処理は実行されません。ただし、ループの外にある処理は続けて実行されます。

C#
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
Console.WriteLine("breakを実行します");
break;
}

Console.WriteLine("i = " + i);
}

Console.WriteLine("次の処理へ進みます");

実行結果は次のようになります。

C#
i = 1
i = 2
breakを実行します
次の処理へ進みます

breakの後、同じループ内に処理があっても実行されません。しかし、ループを抜けた後の処理は通常どおり実行されます。

2-4. breakを使う典型的な場面

breakは、次のような場面でよく使われます。

特定の値が見つかったら検索を終了する場合。

C#
string[] names = { "田中", "佐藤", "鈴木", "高橋" };

foreach (string name in names)
{
if (name == "鈴木")
{
Console.WriteLine("鈴木さんが見つかりました");
break;
}
}

ユーザーが終了を選んだらメニュー処理を抜ける場合。

C#
while (true)
{
Console.WriteLine("1: 続行");
Console.WriteLine("0: 終了");

string input = Console.ReadLine();

if (input == "0")
{
break;
}

Console.WriteLine("処理を続けます");
}

条件を満たした時点で、それ以上の処理が不要になる場合。

C#
int total = 0;

for (int i = 1; i <= 100; i++)
{
total += i;

if (total >= 50)
{
break;
}
}

Console.WriteLine(total);

このように、breakは処理の終了条件を明確にするために使われます。

3. for文でbreakを使う方法

3-1. forループを途中で終了する基本例

for文は、決まった回数だけ処理を繰り返したいときによく使います。しかし、条件によっては予定回数より前に処理を終えたいことがあります。

そのような場合にbreakを使います。

C#
for (int i = 1; i <= 10; i++)
{
if (i == 4)
{
break;
}

Console.WriteLine(i);
}

実行結果は次のようになります。

C#
1
2
3

本来は1から10まで繰り返すループですが、i4になった時点で終了します。

3-2. 指定した値が見つかったらループを抜ける

for文とbreakの組み合わせでよく使われるのが、配列やリストから特定の値を探す処理です。

C#
int[] scores = { 65, 72, 88, 90, 55 };
int target = 88;

for (int i = 0; i < scores.Length; i++)
{
if (scores[i] == target)
{
Console.WriteLine(target + " が見つかりました");
break;
}
}

このコードでは、scores配列の中から88を探しています。88が見つかった時点で目的は達成されるため、breakでループを終了します。

見つかった位置も表示したい場合は、次のように書けます。

C#
int[] scores = { 65, 72, 88, 90, 55 };
int target = 88;

for (int i = 0; i < scores.Length; i++)
{
if (scores[i] == target)
{
Console.WriteLine(target + " は " + i + " 番目にあります");
break;
}
}

配列のインデックスは0から始まるため、この場合は2番目と表示されます。

3-3. 無駄な繰り返し処理を減らすbreakの使い方

breakを使うと、不要な繰り返しを避けることができます。

たとえば、次のようなコードを考えてみましょう。

C#
int[] numbers = { 3, 8, 12, 20, 25, 30 };

for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] > 10)
{
Console.WriteLine("10より大きい値が見つかりました");
break;
}
}

この配列では、12が最初に10より大きい値です。12が見つかった時点で、それ以降の202530を調べる必要がない場合は、breakで処理を止めるのが効率的です。

特に、データ件数が多い場合、条件を満たした時点でループを抜けることで処理時間を短くできることがあります。

3-4. for文でbreakを使うときの注意点

for文でbreakを使うときは、どのタイミングでループが終了するかを意識することが大切です。

次のコードを見てください。

C#
for (int i = 0; i < 5; i++)
{
if (i == 0)
{
break;
}

Console.WriteLine(i);
}

この場合、iは最初から0です。そのため、最初の繰り返しでbreakが実行され、Console.WriteLine(i);は一度も実行されません。

また、breakの条件がわかりにくいと、コードを読んだ人が「なぜここでループが終わるのか」を理解しにくくなります。

C#
for (int i = 0; i < 100; i++)
{
if (Check(i))
{
break;
}
}

このような場合、Check(i)が何を判定しているのかがわかりにくいと、breakの意味も伝わりにくくなります。メソッド名や変数名をわかりやすくすることが大切です。

C#
for (int i = 0; i < 100; i++)
{
if (IsTargetFound(i))
{
break;
}
}

breakは便利ですが、条件を明確にして使うことが重要です。

4. while文・do while文でbreakを使う方法

4-1. whileループを条件付きで抜ける方法

while文は、条件がtrueの間、処理を繰り返す構文です。breakを使うと、while文の条件とは別の条件でループを終了できます。

C#
int count = 0;

while (count < 10)
{
count++;

if (count == 5)
{
break;
}

Console.WriteLine(count);
}

実行結果は次のようになります。

C#
1
2
3
4

count < 10という条件ではまだ繰り返し可能ですが、count == 5になった時点でbreakによりループが終了します。

4-2. 無限ループをbreakで終了する方法

while文では、あえて無限ループを作り、特定の条件でbreakする書き方がよく使われます。

C#
while (true)
{
Console.WriteLine("終了するには exit と入力してください");
string input = Console.ReadLine();

if (input == "exit")
{
break;
}

Console.WriteLine("入力内容: " + input);
}

Console.WriteLine("プログラムを終了しました");

while (true)は、条件が常にtrueなので、そのままでは永遠に繰り返されます。しかし、ユーザーがexitと入力したときにbreakが実行されるため、ループを終了できます。

このような書き方は、メニュー処理、入力受付、ゲームループ、監視処理などでよく使われます。

4-3. do while文でbreakを使う例

do while文は、条件判定より前に必ず一度処理を実行するループです。

C#
int number = 0;

do
{
number++;

if (number == 3)
{
break;
}

Console.WriteLine(number);

} while (number < 5);

実行結果は次のようになります。

C#
1
2

number3になった時点でbreakが実行されるため、do while文の条件判定を待たずにループが終了します。

ユーザー入力を最低一度は受け付けたい場合にも、do whilebreakは便利です。

C#
string input;

do
{
Console.WriteLine("コマンドを入力してください");
input = Console.ReadLine();

if (input == "end")
{
break;
}

Console.WriteLine("実行: " + input);

} while (true);

このコードでは、最低一度は入力を受け付け、endが入力されたら終了します。

4-4. while文でbreakが必要になるケース

while文でbreakが必要になるのは、ループ条件だけでは終了タイミングを表現しにくい場合です。

たとえば、次のような処理です。

C#
while (true)
{
string input = Console.ReadLine();

if (input == null)
{
break;
}

if (input == "quit")
{
break;
}

Console.WriteLine(input);
}

この例では、入力がnullの場合や、quitが入力された場合にループを終了します。終了条件が複数ある場合、while文の条件部分にすべて書くより、ループ内でif文とbreakを使ったほうが読みやすいことがあります。

ただし、breakが多すぎると処理の流れが追いにくくなるため、終了条件が増えすぎた場合はメソッドに分けることも検討しましょう。

5. switch文でbreakを使う方法

5-1. switch文におけるbreakの役割

switch文は、値に応じて処理を分岐する構文です。C#のswitch文では、各caseの処理を終了するためにbreakを使うことが多いです。

C#
int menu = 1;

switch (menu)
{
case 1:
Console.WriteLine("登録処理");
break;

case 2:
Console.WriteLine("更新処理");
break;

case 3:
Console.WriteLine("削除処理");
break;

default:
Console.WriteLine("不明なメニュー");
break;
}

このコードでは、menuの値が1なので、case 1の処理が実行されます。その後、breakによってswitch文全体を抜けます。

5-2. caseごとにbreakを書く理由

switch文でcaseごとにbreakを書く理由は、選択された処理が終わったあとにswitch文を終了するためです。

C#
string rank = "A";

switch (rank)
{
case "A":
Console.WriteLine("とても良い");
break;

case "B":
Console.WriteLine("良い");
break;

case "C":
Console.WriteLine("普通");
break;

default:
Console.WriteLine("評価なし");
break;
}

rank"A"の場合、"とても良い"と表示されたあと、breakswitch文を抜けます。

C#では、基本的に空ではないcaseから次のcaseへそのまま流れるような書き方はできません。そのため、各caseの最後にはbreakreturnthrowなど、処理を終了させる文を書く必要があります。

5-3. breakを書かない場合の挙動

C#のswitch文でbreakを書かないと、状況によってはコンパイルエラーになります。

C#
int value = 1;

switch (value)
{
case 1:
Console.WriteLine("1です");

case 2:
Console.WriteLine("2です");
break;
}

このコードはエラーになります。case 1の処理のあと、case 2へそのまま処理が進む可能性があるためです。

ただし、空のcaseをまとめる書き方はできます。

C#
int value = 2;

switch (value)
{
case 1:
case 2:
case 3:
Console.WriteLine("1から3のいずれかです");
break;

default:
Console.WriteLine("それ以外です");
break;
}

このコードでは、case 1case 2case 3をまとめて同じ処理にしています。空のcaseを連続させる書き方は問題ありません。

5-4. default句とbreakの使い方

default句は、どのcaseにも一致しなかったときに実行される処理です。

C#
string command = "help";

switch (command)
{
case "start":
Console.WriteLine("開始します");
break;

case "stop":
Console.WriteLine("停止します");
break;

default:
Console.WriteLine("不明なコマンドです");
break;
}

default句にも、通常はbreakを書きます。

defaultが最後にある場合でも、可読性や一貫性のためにbreakを書いておくとよいでしょう。後からcaseを追加したときにも、意図しないエラーや読み間違いを防ぎやすくなります。

5-5. switch式との違いも簡単に確認

C#には、従来のswitch文とは別に、switch式もあります。

switch文は、処理を分岐するための構文です。

C#
int score = 85;
string grade;

switch (score)
{
case >= 90:
grade = "A";
break;

case >= 70:
grade = "B";
break;

default:
grade = "C";
break;
}

一方、switch式は、値を返すための式です。

C#
int score = 85;

string grade = score switch
{
>= 90 => "A",
>= 70 => "B",
_ => "C"
};

switch式では、各分岐にbreakを書きません。=>の右側に返す値を書きます。

そのため、breakが必要になるのは主に従来のswitch文です。switch式ではbreakを使わない、と覚えておくとよいでしょう。

6. ネストしたループでbreakを使う場合の挙動

6-1. breakで抜けられるのは一番内側のループだけ

ループの中にさらにループがある状態を、ネストしたループ、または二重ループと呼びます。

ネストしたループでbreakを使うと、抜けられるのは基本的に一番内側のループだけです。

C#
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
break;
}

Console.WriteLine("i=" + i + ", j=" + j);
}
}

実行結果は次のようになります。

C#
i=1, j=1
i=2, j=1
i=3, j=1

内側のfor文では、j == 2になった時点でbreakします。しかし、外側のfor文は続きます。そのため、i123と進みます。

6-2. 二重ループでbreakを使うサンプル

二次元配列から特定の値を探す例を見てみましょう。

C#
int[,] numbers =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};

for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
if (numbers[row, col] == 5)
{
Console.WriteLine("5が見つかりました");
break;
}

Console.WriteLine(numbers[row, col]);
}
}

このコードでは、5が見つかったときに内側のループだけを抜けます。外側のループは続くため、その後も次の行の処理が実行されます。

breakは「現在いる一番近いループ」を終了するだけであり、すべてのループをまとめて終了するわけではありません。

6-3. 外側のループまで抜けたい場合の対処法

二重ループで目的の値が見つかったら、外側のループも含めて完全に終了したい場合があります。

その場合、いくつかの方法があります。

代表的なのは、フラグ変数を使う方法です。

C#
bool found = false;

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == 1 && j == 1)
{
found = true;
break;
}
}

if (found)
{
break;
}
}

内側のループで条件を満たしたらfoundtrueにして、まず内側のループを抜けます。その後、外側のループでもfoundを確認し、breakで終了します。

6-4. フラグ変数を使って複数階層のループを抜ける

より実践的な例として、二次元配列から値を探す処理を書いてみます。

C#
int[,] matrix =
{
{ 10, 20, 30 },
{ 40, 50, 60 },
{ 70, 80, 90 }
};

int target = 50;
bool found = false;

for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
if (matrix[row, col] == target)
{
Console.WriteLine("見つかりました: row=" + row + ", col=" + col);
found = true;
break;
}
}

if (found)
{
break;
}
}

このように書くと、targetが見つかった時点で内側と外側の両方のループを終了できます。

ただし、フラグ変数が増えすぎるとコードが読みにくくなることもあります。その場合は、次に紹介するようにメソッド化するのがおすすめです。

6-5. メソッド化してreturnで抜ける方法

二重ループや複雑な探索処理では、メソッド化してreturnで抜ける方法が読みやすくなることがあります。

C#
static bool ContainsValue(int[,] matrix, int target)
{
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
if (matrix[row, col] == target)
{
return true;
}
}
}

return false;
}

このコードでは、targetが見つかった時点でreturn true;が実行され、メソッド全体が終了します。

呼び出し側は次のように書けます。

C#
int[,] matrix =
{
{ 10, 20, 30 },
{ 40, 50, 60 },
{ 70, 80, 90 }
};

if (ContainsValue(matrix, 50))
{
Console.WriteLine("値が見つかりました");
}

複数階層のループを抜けたい場合、breakだけで無理に書くより、メソッドに分けてreturnするほうが自然なケースもあります。

7. break・continue・returnの違い

7-1. breakはループやswitchを終了する

breakは、現在のループやswitch文を終了します。

C#
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}

Console.WriteLine(i);
}

Console.WriteLine("終了");

実行結果は次のようになります。

C#
1
2
終了

breakはループを終了しますが、メソッド全体を終了するわけではありません。そのため、ループの後ろにある処理は実行されます。

7-2. continueは次の繰り返し処理へ進む

continueは、現在の繰り返しだけをスキップして、次の繰り返しに進みます。

C#
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}

Console.WriteLine(i);
}

実行結果は次のようになります。

C#
1
2
4
5

i == 3のときだけConsole.WriteLine(i);が実行されず、次の繰り返しに進みます。

breakはループそのものを終了しますが、continueはループを続けます。この違いが重要です。

7-3. returnはメソッド自体を終了する

returnは、メソッドそのものを終了します。

C#
static void Test()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
return;
}

Console.WriteLine(i);
}

Console.WriteLine("この行は実行されません");
}

このコードでは、i == 3になった時点でreturnが実行され、Testメソッド全体が終了します。そのため、ループの後ろにあるConsole.WriteLine("この行は実行されません");は実行されません。

戻り値があるメソッドでは、値を返して終了します。

C#
static int FindIndex(int[] numbers, int target)
{
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == target)
{
return i;
}
}

return -1;
}

この例では、目的の値が見つかったら、その位置を返してメソッドを終了します。

7-4. break・continue・returnの使い分け早見表

breakcontinuereturnの違いを整理すると、次のようになります。

役割主な使用場所実行後の流れ
breakループやswitchを終了するfor、while、foreach、switchなどループやswitchの次の処理へ進む
continue現在の繰り返しをスキップするfor、while、foreachなど次の繰り返しへ進む
returnメソッドを終了するメソッド内呼び出し元へ戻る

たとえば、次のように使い分けます。

C#
// ループを終わらせたい
break;

// 今回だけスキップしたい
continue;

// メソッド全体を終わらせたい
return;

7-5. どれを使うべきか迷ったときの判断基準

どれを使うべきか迷ったときは、次のように考えると判断しやすくなります。

ループをそこで終わらせたいならbreakです。

C#
if (isFinished)
{
break;
}

今回の処理だけ飛ばして、次の繰り返しを続けたいならcontinueです。

C#
if (isInvalid)
{
continue;
}

メソッド自体を終了したいならreturnです。

C#
if (hasError)
{
return;
}

特に初心者が混同しやすいのは、breakreturnです。breakはループやswitchを抜けるだけですが、returnはメソッド全体を終了します。

8. breakを使う実践的なサンプルコード

8-1. 配列から特定の要素を探してbreakする

配列から特定の要素を探す処理では、見つかった時点でbreakするのが自然です。

C#
string[] fruits = { "apple", "banana", "orange", "grape" };
string target = "orange";

for (int i = 0; i < fruits.Length; i++)
{
if (fruits[i] == target)
{
Console.WriteLine(target + " が見つかりました");
break;
}
}

このコードでは、orangeが見つかった時点でループを終了します。orangeの後ろにあるgrapeは調べません。

見つからなかった場合の処理も加えるなら、次のように書けます。

C#
string[] fruits = { "apple", "banana", "orange", "grape" };
string target = "melon";
bool found = false;

for (int i = 0; i < fruits.Length; i++)
{
if (fruits[i] == target)
{
found = true;
break;
}
}

if (found)
{
Console.WriteLine(target + " が見つかりました");
}
else
{
Console.WriteLine(target + " は見つかりませんでした");
}

breakとフラグ変数を組み合わせることで、検索結果を後から判定できます。

8-2. ユーザー入力を受け付けて終了条件でbreakする

コンソールアプリでは、ユーザーが特定の文字を入力するまで処理を続けることがあります。

C#
while (true)
{
Console.WriteLine("文字を入力してください。終了するには q を入力してください。");
string input = Console.ReadLine();

if (input == "q")
{
break;
}

Console.WriteLine("入力された文字: " + input);
}

Console.WriteLine("終了しました");

このコードでは、ユーザーがqを入力するまで入力受付を続けます。qが入力されたらbreakで無限ループを抜けます。

メニュー処理にも応用できます。

C#
while (true)
{
Console.WriteLine("1: 登録");
Console.WriteLine("2: 一覧表示");
Console.WriteLine("0: 終了");

string input = Console.ReadLine();

if (input == "0")
{
break;
}

Console.WriteLine("選択された番号: " + input);
}

このように、while (true)breakは、ユーザー操作を待つプログラムでよく使われます。

8-3. 条件を満たした時点で検索処理を止める

大量のデータを調べるとき、条件を満たした時点で処理を止めると効率的です。

C#
int[] prices = { 1200, 2500, 800, 3000, 1500 };

for (int i = 0; i < prices.Length; i++)
{
if (prices[i] >= 3000)
{
Console.WriteLine("3000円以上の商品が見つかりました");
break;
}
}

このコードでは、3000以上の値が見つかった時点でループを終了します。

条件に一致する最初の要素だけが必要な場合、breakを使うことで、それ以降の不要な検索を避けられます。

C#
int[] ages = { 12, 15, 18, 20, 25 };

for (int i = 0; i < ages.Length; i++)
{
if (ages[i] >= 18)
{
Console.WriteLine("最初の成人年齢: " + ages[i]);
break;
}
}

この例では、最初に見つかった18を表示して終了します。

8-4. switch文でメニュー処理を分岐してbreakする

switch文とbreakを使うと、メニュー処理をわかりやすく書けます。

C#
Console.WriteLine("メニューを選択してください");
Console.WriteLine("1: 新規作成");
Console.WriteLine("2: 編集");
Console.WriteLine("3: 削除");

string menu = Console.ReadLine();

switch (menu)
{
case "1":
Console.WriteLine("新規作成を開始します");
break;

case "2":
Console.WriteLine("編集を開始します");
break;

case "3":
Console.WriteLine("削除を開始します");
break;

default:
Console.WriteLine("正しい番号を入力してください");
break;
}

caseの最後にbreakを書くことで、選択された処理だけを実行してswitch文を抜けます。

while文と組み合わせると、繰り返しメニューを表示するプログラムも作れます。

C#
while (true)
{
Console.WriteLine("1: 新規作成");
Console.WriteLine("2: 編集");
Console.WriteLine("0: 終了");

string menu = Console.ReadLine();

switch (menu)
{
case "1":
Console.WriteLine("新規作成を実行しました");
break;

case "2":
Console.WriteLine("編集を実行しました");
break;

case "0":
Console.WriteLine("終了します");
return;

default:
Console.WriteLine("不明なメニューです");
break;
}
}

この例では、case "0"returnを使っています。breakだとswitch文を抜けるだけなので、whileループは続いてしまいます。メソッド全体を終了したい場合はreturnが適しています。

8-5. 無限ループとbreakを組み合わせた実用例

無限ループとbreakは、終了条件がループの途中で決まる処理に向いています。

C#
int total = 0;

while (true)
{
Console.WriteLine("数値を入力してください。0で終了します。");
string input = Console.ReadLine();

int number = int.Parse(input);

if (number == 0)
{
break;
}

total += number;
}

Console.WriteLine("合計: " + total);

このコードでは、ユーザーが入力した数値を合計していき、0が入力されたら終了します。

より安全に書くなら、int.TryParseを使います。

C#
int total = 0;

while (true)
{
Console.WriteLine("数値を入力してください。0で終了します。");
string input = Console.ReadLine();

if (!int.TryParse(input, out int number))
{
Console.WriteLine("数値を入力してください");
continue;
}

if (number == 0)
{
break;
}

total += number;
}

Console.WriteLine("合計: " + total);

この例では、数値に変換できない入力はcontinueでスキップし、0が入力されたらbreakで終了します。breakcontinueを適切に組み合わせると、実用的で読みやすい処理を書けます。

9. breakでよくあるエラー・つまずきポイント

9-1. 「break文が使えない場所」で発生するエラー

breakは、ループやswitch文の中でしか使えません。

次のコードはエラーになります。

C#
static void Main()
{
int number = 10;

if (number > 5)
{
break;
}
}

if文の中にbreakがありますが、外側にループやswitch文がありません。そのため、breakで抜ける対象が存在しません。

正しく書くなら、ループの中で使います。

C#
for (int i = 0; i < 10; i++)
{
if (i > 5)
{
break;
}

Console.WriteLine(i);
}

また、メソッドを終了したい場合はbreakではなくreturnを使います。

C#
static void Main()
{
int number = 10;

if (number > 5)
{
return;
}

Console.WriteLine("この行は実行されません");
}

9-2. breakを書いたのに外側のループが続く理由

二重ループでbreakを書いたのに、外側のループが続いてしまうことがあります。

C#
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (j == 1)
{
break;
}

Console.WriteLine("i=" + i + ", j=" + j);
}
}

このコードでは、breakで終了するのは内側のfor文だけです。外側のfor文はそのまま続きます。

外側のループも終了したい場合は、フラグ変数を使います。

C#
bool stop = false;

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (j == 1)
{
stop = true;
break;
}
}

if (stop)
{
break;
}
}

または、処理をメソッド化してreturnで終了する方法もあります。

9-3. switch文でbreakを書き忘れたときの問題

C#のswitch文では、caseの終わりにbreakなどの終了文が必要です。

C#
int value = 1;

switch (value)
{
case 1:
Console.WriteLine("1です");
break;

case 2:
Console.WriteLine("2です");
break;
}

このように、各casebreakを書くのが基本です。

breakを書き忘れると、意図しない処理の流れになったり、コンパイルエラーになったりします。

ただし、次のように複数のcaseをまとめることはできます。

C#
int value = 2;

switch (value)
{
case 1:
case 2:
Console.WriteLine("1または2です");
break;

default:
Console.WriteLine("その他です");
break;
}

空のcaseを並べて、最後にまとめて処理を書くパターンです。

9-4. breakとreturnを混同してしまうケース

初心者がよく混同するのが、breakreturnです。

次のコードを見てください。

C#
static void Test()
{
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
break;
}

Console.WriteLine(i);
}

Console.WriteLine("メソッド内の後続処理");
}

実行結果は次のようになります。

C#
0
1
メソッド内の後続処理

breakはループを終了するだけなので、ループの後ろにある処理は実行されます。

一方、returnを使うとメソッド全体が終了します。

C#
static void Test()
{
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
return;
}

Console.WriteLine(i);
}

Console.WriteLine("メソッド内の後続処理");
}

この場合、Console.WriteLine("メソッド内の後続処理");は実行されません。

ループだけを抜けたいならbreak、メソッドを終了したいならreturnと覚えましょう。

9-5. 可読性を下げるbreakの使いすぎに注意

breakは便利ですが、使いすぎると処理の流れがわかりにくくなることがあります。

C#
while (true)
{
if (condition1)
{
break;
}

if (condition2)
{
break;
}

if (condition3)
{
break;
}

// 処理
}

このようにbreakが多いと、どの条件でループが終わるのかを追いにくくなります。

終了条件が複数ある場合でも、それぞれの意味が明確であれば問題ありません。しかし、条件が複雑になってきたら、メソッドに分けたり、条件判定を変数にまとめたりすると読みやすくなります。

C#
bool shouldStop = condition1 || condition2 || condition3;

if (shouldStop)
{
break;
}

breakは処理をわかりやすくするために使うものであり、複雑にするためのものではありません。

10. breakを読みやすく安全に使うためのポイント

10-1. break条件はわかりやすく書く

breakを使うときは、どの条件でループを抜けるのかが一目でわかるように書くことが大切です。

C#
if (count >= maxCount)
{
break;
}

このように書かれていれば、「最大回数に達したら終了する」とすぐに理解できます。

反対に、次のようなコードは意味が伝わりにくい場合があります。

C#
if (Check(value))
{
break;
}

Checkが何を確認しているのかわからないため、breakの理由もわかりにくくなります。

メソッド名を具体的にすると読みやすくなります。

C#
if (IsTargetValue(value))
{
break;
}

10-2. ループの目的を明確にしてからbreakを使う

breakを使う前に、そのループの目的を明確にしましょう。

たとえば、配列から最初に一致する値を探すループであれば、見つかった時点でbreakするのは自然です。

C#
foreach (string item in items)
{
if (item == target)
{
found = true;
break;
}
}

一方、すべての要素を確認する必要がある処理では、途中でbreakしてしまうと不具合の原因になります。

C#
foreach (int score in scores)
{
if (score < 0)
{
break;
}

total += score;
}

このコードでは、負の値が出た時点で合計処理が止まります。それが仕様なら問題ありませんが、単に不正な値だけをスキップしたいならcontinueのほうが適切です。

C#
foreach (int score in scores)
{
if (score < 0)
{
continue;
}

total += score;
}

ループを終了したいのか、現在の要素だけスキップしたいのかを明確にしましょう。

10-3. 深いネストでは処理を分割する

ネストが深いコードでbreakを使うと、どのループを抜けるのかがわかりにくくなります。

C#
for (...)
{
for (...)
{
for (...)
{
if (condition)
{
break;
}
}
}
}

この場合、breakで抜けるのは一番内側のループだけです。しかし、コードを読む側は処理の流れを追うのに時間がかかります。

深いネストになったら、メソッドに分けることを検討しましょう。

C#
static bool ExistsTarget(int[,] matrix, int target)
{
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
if (matrix[row, col] == target)
{
return true;
}
}
}

return false;
}

このようにメソッド化すると、breakよりもreturnのほうが自然に書けることがあります。

10-4. コメントが必要になる複雑なbreakは見直す

コメントを書くこと自体は悪くありません。しかし、breakの理由を長いコメントで説明しないとわからない場合は、コードが複雑になっている可能性があります。

C#
// ここで処理を止めないと、後続処理で不正な状態になるため終了する
if (status == 9 && count > 10 && mode != "test")
{
break;
}

このような条件は、変数やメソッドに分けると読みやすくなります。

C#
bool shouldStopProcessing = status == 9 && count > 10 && mode != "test";

if (shouldStopProcessing)
{
break;
}

さらに意味を明確にするなら、メソッド化します。

C#
if (ShouldStopProcessing(status, count, mode))
{
break;
}

breakの条件は、できるだけコードだけで意味が伝わるように書くのが理想です。

10-5. 保守しやすいコードにするための使い方

保守しやすいコードにするためには、breakを使う理由を明確にすることが大切です。

よい使い方の例です。

C#
foreach (User user in users)
{
if (user.Id == targetId)
{
targetUser = user;
break;
}
}

このコードは、「対象ユーザーが見つかったらループを終了する」という意図が明確です。

一方で、次のようなコードは注意が必要です。

C#
foreach (User user in users)
{
if (user.IsActive)
{
DoSomething(user);
}

if (user.HasError)
{
break;
}

if (user.IsAdmin)
{
break;
}
}

breakの条件が複数あり、それぞれの意味が異なると、後から読んだ人が理解しにくくなります。

このような場合は、処理を分けたり、終了条件を整理したりしましょう。

C#
foreach (User user in users)
{
if (ShouldStop(user))
{
break;
}

if (user.IsActive)
{
DoSomething(user);
}
}

breakは、シンプルな条件で使うほど読みやすく、安全に扱えます。

11. C# breakに関するよくある質問

11-1. breakはif文だけで使えるのか

breakは、if文だけの中では使えません。

C#
if (true)
{
break; // エラー
}

breakは、ループやswitch文を抜けるための文です。そのため、外側にforwhileforeachswitchなどが必要です。

次のように、if文がループの中にある場合は使えます。

C#
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break;
}
}

この場合、breakif文ではなく、外側のfor文を終了します。

11-2. breakでメソッドを終了できるのか

breakではメソッドを終了できません。

breakが終了できるのは、ループやswitch文です。

C#
static void Sample()
{
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
break;
}
}

Console.WriteLine("この処理は実行されます");
}

このコードでは、breakfor文は終了しますが、メソッドは続きます。

メソッド自体を終了したい場合は、returnを使います。

C#
static void Sample()
{
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
return;
}
}

Console.WriteLine("この処理は実行されません");
}

11-3. foreach文でもbreakは使えるのか

はい、foreach文でもbreakは使えます。

C#
string[] names = { "田中", "佐藤", "鈴木" };

foreach (string name in names)
{
if (name == "佐藤")
{
Console.WriteLine("佐藤さんが見つかりました");
break;
}
}

foreach文で配列やリストを順番に処理しているとき、目的の要素が見つかったらbreakでループを終了できます。

foreach文はすべての要素を処理するイメージがありますが、breakを使えば途中で終了できます。

11-4. try-catch-finally内でbreakを使うとどうなるのか

trycatchの中でも、ループやswitch文の中であればbreakを使えます。

C#
while (true)
{
try
{
Console.WriteLine("数値を入力してください");
int number = int.Parse(Console.ReadLine());

if (number == 0)
{
break;
}

Console.WriteLine(number);
}
catch
{
Console.WriteLine("数値ではありません");
}
}

この例では、number == 0のときにbreakwhileループを終了します。

finallyがある場合、breakでループを抜ける前にfinallyブロックが実行されます。

C#
while (true)
{
try
{
break;
}
finally
{
Console.WriteLine("finallyが実行されます");
}
}

Console.WriteLine("ループ終了");

実行結果は次のようになります。

C#
finallyが実行されます
ループ終了

finallyは、breakで抜ける場合でも実行される点を覚えておきましょう。

11-5. breakとgotoの違いは何か

breakは、ループやswitch文を終了するための文です。一方、gotoは指定したラベルへジャンプする文です。

C#
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
break;
}
}

breakは、現在のループを終了して次の処理へ進みます。

gotoを使うと、ラベルの位置へ移動できます。

C#
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
goto End;
}
}

End:
Console.WriteLine("終了");

ただし、gotoは処理の流れがわかりにくくなりやすいため、通常はあまり使いません。多くの場合、breakreturn、メソッド分割などで十分対応できます。

特に初心者のうちは、gotoよりもbreakreturnを使ったわかりやすい書き方を意識するとよいでしょう。

まとめ

C#のbreakは、ループやswitch文を途中で終了するために使う基本的な文です。

for文では、指定した値が見つかった時点でループを抜ける処理に使えます。while文では、無限ループを特定条件で終了する場面によく使われます。switch文では、各caseの処理を終えてswitch文を抜けるために使います。

ただし、breakで抜けられるのは、基本的に現在のループやswitch文だけです。ネストしたループでは一番内側のループしか抜けないため、外側のループまで終了したい場合は、フラグ変数を使うか、処理をメソッド化してreturnを使う方法を検討しましょう。

また、breakcontinuereturnは役割が異なります。breakはループやswitchを終了し、continueは現在の繰り返しをスキップし、returnはメソッド全体を終了します。

breakを使うときは、終了条件をわかりやすく書くことが重要です。条件が複雑になりすぎる場合は、変数やメソッドに分けることで、読みやすく保守しやすいコードになります。

C#で繰り返し処理や条件分岐を書くうえで、breakは非常によく使う文です。基本的な使い方と注意点を押さえて、必要なタイミングで適切に使えるようにしましょう。