閉じる

【C#】ループ制御入門|breakとcontinueの正しい使い分け

C#でforやforeachなどのループを書くとき、処理を途中で抜けたりスキップしたくなることがあります。

このとき登場するのがbreakcontinueです。

同じ「途中で流れを変える」キーワードですが、意味も使いどころもまったく異なります。

本記事では、基本文法からありがちなミス、実務的な使い分けのコツまで、一気に整理して解説していきます。

【C#】breakとcontinueとは何か

ループ制御キーワードの役割

C#にはループの流れを途中で変えるためのキーワードがいくつかあります。

その中でも代表的なのがbreakcontinueです。

文章でそれぞれの役割をまとめると、次のようになります。

  • break
    いま実行中のループ自体をその場で終了します。次の反復には進まず、ループの外側の処理へ移動します。
  • continue
    いまの反復における残りの処理をスキップし、すぐに「次の繰り返し」へ移ります。ループ自体は続きます。

この2つの違いを明確にイメージしておくと、意図しない無限ループや処理漏れを防ぎやすくなります。

breakの基本と使い方

breakの基本動作

break「もうこのループは続けなくてよい」という場面で使うキーワードです。

典型的には、特定の条件を満たした要素を見つけたら検索を打ち切るようなケースで利用します。

for文でのbreakの例

C#
using System;

class Program
{
    static void Main()
    {
        // 1〜10までの数字の中から、最初に5で割り切れる数を探します
        for (int i = 1; i <= 10; i++)
        {
            // iが5で割り切れるかをチェック
            if (i % 5 == 0)
            {
                Console.WriteLine($"5で割り切れる最初の数は {i} です。");
                
                // 条件を満たす数が見つかったので、ループを終了します
                break;
            }

            // 条件を満たさなかったときに実行される部分
            Console.WriteLine($"{i} は5で割り切れません。");
        }

        Console.WriteLine("ループが終了しました。");
    }
}
実行結果
1 は5で割り切れません。
2 は5で割り切れません。
3 は5で割り切れません。
4 は5で割り切れません。
5で割り切れる最初の数は 5 です。
ループが終了しました。

5が見つかった時点でループ全体が終了しており、その後の6〜10はチェックされていないことがポイントです。

foreachやwhileでも同じ動作

breakforだけでなく、foreachwhiledo ... whileでも同じように使えます。

C#
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var names = new List<string> { "Tanaka", "Suzuki", "Sato", "Yamada" };

        foreach (var name in names)
        {
            Console.WriteLine($"チェック中: {name}");

            // "Sato" を見つけたらそこでループを終了
            if (name == "Sato")
            {
                Console.WriteLine("Sato を見つけたので、検索を終了します。");
                break;  // foreach全体がここで終了します
            }
        }

        Console.WriteLine("foreachの後の処理です。");
    }
}
実行結果
チェック中: Tanaka
チェック中: Suzuki
チェック中: Sato
Sato を見つけたので、検索を終了します。
foreachの後の処理です。

continueの基本と使い方

continueの基本動作

continue「今回は残りを飛ばして、次の回に進みたい」ときに使うキーワードです。

ループ全体は続けたいが、特定条件のときだけ処理をスキップしたい場面に向いています。

for文でのcontinueの例

C#
using System;

class Program
{
    static void Main()
    {
        // 1〜10のうち、偶数だけを処理する例です
        for (int i = 1; i <= 10; i++)
        {
            // iが奇数のときは、残りの処理をスキップして次のループへ
            if (i % 2 == 1)
            {
                // ここでcontinueを実行すると、下のConsole.WriteLineは実行されません
                continue;
            }

            // 偶数のときだけ実行される処理
            Console.WriteLine($"{i} は偶数です。");
        }

        Console.WriteLine("ループが終了しました。");
    }
}
実行結果
2 は偶数です。
4 は偶数です。
6 は偶数です。
8 は偶数です。
10 は偶数です。
ループが終了しました。

奇数のときはcontinueによってその回の残り処理がスキップされている点に注目してください。

continueはforeachやwhileでも使用可能

C#
using System;

class Program
{
    static void Main()
    {
        int[] numbers = { -3, -1, 0, 1, 2, 3 };

        foreach (var n in numbers)
        {
            // 0は除外したいケース
            if (n == 0)
            {
                // 0のときは、以下の処理を飛ばして次の要素へ
                continue;
            }

            Console.WriteLine($"{n} の2乗は {n * n} です。");
        }
    }
}
実行結果
-3 の2乗は 9 です。
-1 の2乗は 1 です。
1 の2乗は 1 です。
2 の2乗は 4 です。
3 の2乗は 9 です。

breakとcontinueの違いを整理する

挙動の比較

文章で整理すると、次のようになります。

  • break
    そのループ構造(一番内側)を完全に終了させる。
  • continue
    現在の反復の残りの処理だけを飛ばして次の反復へ進む。

この違いを、実際のコードで確認してみます。

同じ条件でbreakとcontinueを比較する

C#
using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("=== break の場合 ===");
        for (int i = 1; i <= 5; i++)
        {
            if (i == 3)
            {
                Console.WriteLine("i が 3 なので break します。");
                break;  // ここでforループ自体が終了
            }

            Console.WriteLine($"i = {i}");
        }

        Console.WriteLine();
        Console.WriteLine("=== continue の場合 ===");
        for (int i = 1; i <= 5; i++)
        {
            if (i == 3)
            {
                Console.WriteLine("i が 3 なので continue します。");
                continue;  // この回の残りをスキップして次のiへ
            }

            Console.WriteLine($"i = {i}");
        }
    }
}
実行結果
=== break の場合 ===
i = 1
i = 2
i が 3 なので break します。

=== continue の場合 ===
i = 1
i = 2
i が 3 なので continue します。
i = 4
i = 5

breakでは「3以降」が一切実行されないのに対し、continueでは「3の回」だけをスキップして4以降も処理が続くことが分かります。

使い分けの判断基準

基本方針

breakとcontinueを迷わず使い分けるコツは、次の1行に集約できます。

「ループを終わらせたいならbreak、ループは続けたいが“この回だけ”飛ばしたいならcontinue」

より具体的には、次のように考えます。

  • 検索や探索の終了条件ならbreak
  • 入力値などの一部を無視(スキップ)したいならcontinue

実務でよくあるパターン

パターン1: ヒットしたら終わりの検索処理(break)

C#
using System;

class Program
{
    static void Main()
    {
        string[] users = { "Alice", "Bob", "Charlie", "David" };
        string target = "Charlie";

        bool found = false;

        foreach (var user in users)
        {
            if (user == target)
            {
                found = true;
                Console.WriteLine($"{target} を見つけました。");
                
                // もう探す必要がないのでループを終了
                break;
            }
        }

        if (!found)
        {
            Console.WriteLine($"{target} は存在しません。");
        }
    }
}
実行結果
Charlie を見つけました。

1件見つかれば十分なときは、breakでループを打ち切るのが効率的です。

パターン2: 不正データだけ飛ばして処理を続ける(continue)

C#
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var inputs = new List<string> { "10", "abc", "20", "", "30" };
        int sum = 0;

        foreach (var text in inputs)
        {
            // 数値に変換できなければ、そのデータはスキップする
            if (!int.TryParse(text, out int value))
            {
                Console.WriteLine($"変換できない値をスキップしました: \"{text}\"");
                continue;  // この回の加算処理をスキップして次へ
            }

            sum += value;
        }

        Console.WriteLine($"合計値は {sum} です。");
    }
}
実行結果
変換できない値をスキップしました: "abc"
変換できない値をスキップしました: ""
合計値は 60 です。

「一部だけ無視したい」場面ではcontinueが自然です。

ネストしたループでの注意点

breakとcontinueは「一番内側のループ」に効く

C#ではbreakcontinue「今いる一番内側のループ」にだけ作用します。

外側のループまで一気に抜けることはありません。

二重ループでの挙動

C#
using System;

class Program
{
    static void Main()
    {
        for (int i = 1; i <= 3; i++)
        {
            Console.WriteLine($"--- 外側ループ i = {i} ---");

            for (int j = 1; j <= 3; j++)
            {
                if (j == 2)
                {
                    Console.WriteLine("  j が 2 なので、内側ループを break します。");
                    break;  // 抜けるのは「内側ループ(j)」だけ
                }

                Console.WriteLine($"  内側ループ j = {j}");
            }
        }
    }
}
実行結果
--- 外側ループ i = 1 ---
  内側ループ j = 1
  j が 2 なので、内側ループを break します。
--- 外側ループ i = 2 ---
  内側ループ j = 1
  j が 2 なので、内側ループを break します。
--- 外側ループ i = 3 ---
  内側ループ j = 1
  j が 2 なので、内側ループを break します。

ここでは外側ループ<i>は最後まで回っています。

この点を勘違いすると、思ったよりループが続いてしまうバグにつながります。

書き方・読みやすさのコツ

条件を早期に除外する時はcontinueが有効

複雑な条件のif文がネストして読みにくくなる場合、continueで「いらないケースを先に除外する」書き方が有効です。

C#
using System;

class Program
{
    static void Main()
    {
        int[] numbers = { -3, -2, -1, 0, 1, 2, 3 };

        foreach (var n in numbers)
        {
            // 条件を満たさないものは早めにスキップする
            if (n <= 0)
            {
                continue;
            }

            // ここに来るのは「正の数だけ」
            Console.WriteLine($"{n} の2倍は {n * 2} です。");
        }
    }
}
実行結果
1 の2倍は 2 です。
2 の2倍は 4 です。
3 の2倍は 6 です。

「条件を満たさないものは早く帰す」という書き方は、メソッドでもループでも読みやすさ向上に役立ちます。

乱用は避ける

一方で、breakとcontinueを多用しすぎるとロジックが追いにくくなることもあります。

とくに以下の場合は、設計を見直した方がよいことが多いです。

  • 1つのループ内にbreakcontinueが何度も登場する
  • ネストされたループの中で、複数のbreakが入り組んでいる

「本当にループで書くべきか」「メソッド分割できないか」といった観点で、構造自体をシンプルにすることも重要です。

まとめ

breakはループ自体を終了し、continueはその回の残り処理だけをスキップして次の繰り返しへ進むキーワードです。

検索処理の打ち切りにはbreak、不正データや不要ケースのスキップにはcontinueと考えると使い分けやすくなります。

どちらも便利ですが、乱用するとかえって読みにくくなるため、ループの目的を整理しながら「終わらせたいのか」「一部だけ飛ばしたいのか」を意識して選択すると、意図どおりかつ読みやすいC#コードを書けるようになります。

クラス・構造体・基本要素

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!