ループ処理の「中断」
C#のforやwhileといった繰り返し処理(ループ)は、通常、指定された条件式がfalseになるまで実行され続けます。しかし、プログラムのロジックによっては、条件が満たされる前であっても、特定の事態が発生した時点で即座にループを終了したい場合があります。
例えば、リストから特定のデータを探している場合、データを発見した瞬間にそれ以上探す必要はありません。また、while(true)のような意図的な無限ループの中で、特定の入力(終了コマンドなど)を待つ場合にも、ループを脱出する手段が必要です。
このような「ループの中断」を実現するのが break キーワードです。
break キーワードとは
breakステートメントは、現在実行中の最も内側のループ構文(for, foreach, while, do-while)またはswitch文を、即座に終了させるための命令です。
breakが実行されると、ループブロック内の残りのコードはすべて無視され、制御はループ構文の直後(ループの}の次)のステートメントに移ります。
break の使用例
breakは、if文と組み合わせて「特定の条件が満たされたらループを抜ける」という形で使用するのが一般的です。
例1: foreach での検索処理
foreachループを使用して、コレクション(例: List<T>)から特定の条件に合う最初の要素を検索する場合、breakは非常に有効です。要素が見つかった後も残りの要素をチェックし続けるのは非効率だからです。
using System;
using System.Collections.Generic;
public class LogEntry
{
public int Id { get; set; }
public string Level { get; set; }
public string Message { get; set; }
}
public class BreakForeachExample
{
public static void Main()
{
// 大量のログデータ(シミュレート)
var logEntries = new List<LogEntry>
{
new LogEntry { Id = 1, Level = "Info", Message = "Service started" },
new LogEntry { Id = 2, Level = "Info", Message = "Processing data" },
new LogEntry { Id = 3, Level = "Error", Message = "Null reference exception" }, // 発見対象
new LogEntry { Id = 4, Level = "Info", Message = "Data processed" },
new LogEntry { Id = 5, Level = "Warn", Message = "Disk space low" }
};
LogEntry firstError = null; // 最初に発見したエラーログを格納
Console.WriteLine("ログを検索中...");
foreach (var entry in logEntries)
{
Console.WriteLine($"ログID {entry.Id} ({entry.Level}) をチェック中...");
// "Error" レベルのログを発見
if (entry.Level == "Error")
{
Console.WriteLine($"エラーを発見 (ID: {entry.Id})。検索を中断します。");
firstError = entry;
break; // ループを即座に終了
}
}
Console.WriteLine("---");
if (firstError != null)
{
Console.WriteLine($"最初のエラーメッセージ: {firstError.Message}");
}
else
{
Console.WriteLine("エラーは見つかりませんでした。");
}
}
}
出力結果:
ログを検索中...
ログID 1 (Info) をチェック中...
ログID 2 (Info) をチェック中...
ログID 3 (Error) をチェック中...
エラーを発見 (ID: 3)。検索を中断します。
---
最初のエラーメッセージ: Null reference exception
breakが実行されたため、ID 4と5のログはチェックされずにループが終了しています。
例2: while(true) での意図的な無限ループ
while(true)は、それ自体がtrueであるため、breakがなければ永久に回り続ける「無限ループ」となります。これは、ユーザーからの入力を待ち続けたり、サービスが常駐して監視を続けたりする際によく使われるパターンです。
特定の条件(例: 終了コマンドの入力)が満たされたときにbreakを呼び出すことで、このループを安全に終了させます。
using System;
public class BreakWhileTrueExample
{
public static void Main()
{
Console.WriteLine("メッセージを入力してください (空行で終了)。");
// 意図的な無限ループ
while (true)
{
Console.Write("> ");
string input = Console.ReadLine();
// 終了条件のチェック
// ユーザーが何も入力せずEnterキーを押した場合 (nullまたは空文字列)
if (string.IsNullOrEmpty(input))
{
Console.WriteLine("空行が入力されました。ループを中断します。");
break; // while(true) ループを脱出
}
// 終了条件が満たされなかった場合の通常処理
Console.WriteLine($"エコー: {input}");
}
Console.WriteLine("プログラムを終了します。");
}
}
実行例:
メッセージを入力してください (空行で終了)。
> Hello
エコー: Hello
> C#
エコー: C#
>
空行が入力されました。ループを中断します。
プログラムを終了します。
break と continue の違い
breakとcontinueはどちらもループの制御を行いますが、その動作は正反対です。
break(中断): ループ全体を即座に終了し、ループの外側に脱出します。continue(スキップ): ループの現在の回(イテレーション)だけを中断し、次のイテレーションに進みます(ループは継続します)。
「探していたものが見つかったので、もう探す必要がない」場合はbreakを、「このデータは処理対象外なので、次のデータに移りたい」場合はcontinueを使用します。
まとめ
breakキーワードは、forやwhileなどのループ処理を、その通常の終了条件が満たされる前に強制的に終了させるための強力な制御構文です。
検索処理の効率化や、while(true)を用いたイベントループパターンの実装など、C#プログラミングにおいて不可欠な役割を果たします。
