C# continue文の使い方を初心者向けに解説|breakとの違い・ループ処理の注意点もわかる
はじめに
C#でループ処理を書いていると、「この条件のときだけ処理を飛ばしたい」「特定のデータだけ処理対象から外したい」という場面があります。そんなときに使えるのが、continue文です。
continue文を使うと、ループの中で現在の処理だけをスキップし、次の繰り返しへ進めることができます。たとえば、1から10までの数値を処理する中で、偶数だけを飛ばしたり、配列の中にある空文字だけを無視したりできます。
この記事では、C#のcontinue文について、初心者にもわかりやすく解説します。for文、foreach文、while文、do-while文での使い方に加えて、break文やreturn文との違い、よくあるエラー、注意点も紹介します。
1. C#のcontinue文とは?初心者向けに基本を解説
1-1. continue文は「現在の処理をスキップして次のループへ進む」命令
C#のcontinue文は、ループ処理の途中で使う命令です。continueが実行されると、その時点で現在の繰り返し処理を終了し、次の繰り返しへ進みます。
たとえば、次のようなイメージです。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、iが3のときにcontinueが実行されます。そのため、Console.WriteLine(i);は実行されず、次のループへ進みます。
実行結果は次のようになります。
C#1
2
4
5
3だけが表示されていないことがわかります。
つまり、continue文は「ループを終わらせる」のではなく、「今回の処理だけを飛ばして次へ進む」ための命令です。
1-2. continue文が使えるループ処理の種類
C#のcontinue文は、主に次のループ処理の中で使えます。
C#for文
foreach文
while文
do-while文
それぞれのループの中で、条件に合う場合だけ処理をスキップしたいときに使います。
一方で、ループの外ではcontinue文は使えません。次のようなコードはエラーになります。
C#if (true)
{
continue; // エラー
}
continueはあくまでループ処理の中で使う命令です。
1-3. continue文の基本構文
C#のcontinue文の基本構文はとてもシンプルです。
C#continue;
通常は、if文と組み合わせて使います。
C#for (int i = 0; i < 10; i++)
{
if (条件)
{
continue;
}
// 条件に当てはまらなかった場合だけ実行される処理
}
continueが実行されると、その下にある処理は実行されません。そして、ループの次の回へ進みます。
1-4. continue文を使うと処理の流れがどう変わるのか
通常のループ処理では、上から順番にすべての処理が実行されます。
C#for (int i = 1; i <= 3; i++)
{
Console.WriteLine("開始");
Console.WriteLine(i);
Console.WriteLine("終了");
}
実行結果は次のようになります。
C#開始
1
終了
開始
2
終了
開始
3
終了
ここにcontinueを入れると、処理の流れが変わります。
C#for (int i = 1; i <= 3; i++)
{
Console.WriteLine("開始");
if (i == 2)
{
continue;
}
Console.WriteLine(i);
Console.WriteLine("終了");
}
実行結果は次のようになります。
C#開始
1
終了
開始
開始
3
終了
iが2のときは、continueより下にある処理が実行されません。そのため、2と終了が表示されず、次のループへ進んでいます。
2. C# continue文の基本的な使い方
2-1. for文でcontinueを使う例
for文は、指定した回数だけ繰り返し処理を行うときによく使います。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);が実行されていません。
for文では、continueが実行されたあとに更新式が実行されます。つまり、次の繰り返しに進む前にi++が行われます。
2-2. foreach文でcontinueを使う例
foreach文は、配列やリストなどの要素を順番に取り出して処理するときに使います。
C#string[] names = { "田中", "佐藤", "鈴木", "高橋" };
foreach (string name in names)
{
if (name == "鈴木")
{
continue;
}
Console.WriteLine(name);
}
実行結果は次のようになります。
C#田中
佐藤
高橋
nameが"鈴木"のときだけ、表示処理がスキップされます。
foreach文でcontinueを使うと、現在の要素に対する処理を飛ばして、次の要素へ進みます。
2-3. while文でcontinueを使う例
while文でもcontinue文を使えます。ただし、while文では無限ループにならないように注意が必要です。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のとおりです。
C#1
2
4
5
iが3のときにcontinueが実行されるため、表示処理がスキップされます。
ここで重要なのは、continueより前にi++を書いている点です。もしi++をcontinueの後ろに書いてしまうと、条件によっては値が更新されず、無限ループになる可能性があります。
2-4. do-while文でcontinueを使う例
do-while文でもcontinue文を使えます。do-while文は、条件判定より先に処理を1回実行するループです。
C#int i = 0;
do
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
} while (i < 5);
実行結果は次のようになります。
C#1
2
4
5
iが3のときだけ、Console.WriteLine(i);が実行されません。
do-while文では、continueが実行されると、ループの最後にある条件判定へ進みます。その後、条件が満たされていれば次の繰り返しが実行されます。
2-5. if文と組み合わせて特定条件だけスキップする方法
continue文は、ほとんどの場合if文と組み合わせて使います。特定の条件に当てはまるときだけ、処理をスキップしたいからです。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
このコードでは、i % 2 == 0のとき、つまり偶数のときにcontinueが実行されます。
実行結果は次のとおりです。
C#1
3
5
7
9
偶数がスキップされ、奇数だけが表示されています。
3. continue文の具体例で動きを理解しよう
3-1. 偶数・奇数だけをスキップするサンプル
まずは、偶数をスキップして奇数だけを表示する例です。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
C#1
3
5
7
9
i % 2 == 0は、「2で割った余りが0」という意味です。つまり偶数かどうかを判定しています。
反対に、奇数をスキップして偶数だけを表示したい場合は、条件を次のようにします。
C#for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のとおりです。
C#2
4
6
8
10
このように、continueを使うと「条件に合わないデータを飛ばす」処理を簡単に書けます。
3-2. 配列やリストの特定データを除外するサンプル
配列やリストの中から、特定のデータだけを除外して処理したい場合にもcontinue文は便利です。
C#string[] fruits = { "apple", "banana", "orange", "grape" };
foreach (string fruit in fruits)
{
if (fruit == "banana")
{
continue;
}
Console.WriteLine(fruit);
}
実行結果は次のようになります。
C#apple
orange
grape
"banana"だけがスキップされています。
リストでも同じように使えます。
C#List<int> scores = new List<int> { 80, 45, 90, 30, 70 };
foreach (int score in scores)
{
if (score < 60)
{
continue;
}
Console.WriteLine(score);
}
実行結果は次のとおりです。
C#80
90
70
この例では、60点未満の点数をスキップしています。合格点だけを処理したい場合などに使えます。
3-3. 入力値チェックで不正なデータだけ飛ばすサンプル
入力値のチェックでもcontinue文はよく使われます。たとえば、数値に変換できないデータをスキップする場合です。
C#string[] inputs = { "10", "abc", "25", "", "40" };
foreach (string input in inputs)
{
if (!int.TryParse(input, out int number))
{
continue;
}
Console.WriteLine(number * 2);
}
実行結果は次のようになります。
C#20
50
80
"abc"や空文字""は数値に変換できないため、continueでスキップされます。
int.TryParseは、文字列を数値に変換できるかどうかを判定するメソッドです。変換できない場合はfalseを返します。
このように、正しく処理できないデータを早めに除外すると、後続の処理を安全に書きやすくなります。
3-4. nullや空文字をスキップして処理するサンプル
文字列の配列やリストを扱うとき、nullや空文字が含まれることがあります。そのまま処理するとエラーや意図しない結果につながることがあるため、continueでスキップできます。
C#string[] names = { "田中", "", null, "佐藤", "鈴木" };
foreach (string name in names)
{
if (string.IsNullOrEmpty(name))
{
continue;
}
Console.WriteLine(name);
}
実行結果は次のようになります。
C#田中
佐藤
鈴木
string.IsNullOrEmpty(name)は、文字列がnullまたは空文字かどうかを判定します。
さらに、空白だけの文字列もスキップしたい場合は、string.IsNullOrWhiteSpaceを使います。
C#string[] names = { "田中", " ", null, "佐藤", "" };
foreach (string name in names)
{
if (string.IsNullOrWhiteSpace(name))
{
continue;
}
Console.WriteLine(name);
}
このように、不要なデータを先にスキップすることで、メインの処理をシンプルに保てます。
4. C#のcontinueとbreakの違い
4-1. continueは「次の繰り返しへ進む」
continue文は、現在の繰り返し処理だけをスキップして、次のループへ進みます。ループ自体は終了しません。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のとおりです。
C#1
2
4
5
iが3のときだけスキップされ、4と5の処理は続行されます。
4-2. breakは「ループそのものを終了する」
一方、break文はループそのものを終了します。breakが実行されると、それ以降の繰り返しは行われません。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
C#1
2
iが3になった時点でループが終了するため、3、4、5は表示されません。
4-3. continueとbreakの処理結果を比較
continueとbreakの違いを比較すると、次のようになります。
continueを使った場合です。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果です。
C#1
2
4
5
breakを使った場合です。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
break;
}
Console.WriteLine(i);
}
実行結果です。
C#1
2
continueは「3だけを飛ばして続ける」、breakは「3になったところでループを終わる」と覚えるとわかりやすいです。
4-4. continueとbreakの使い分け早見表
| 命令 | 意味 | ループは続くか | よく使う場面 |
|---|---|---|---|
| continue | 現在の処理をスキップして次のループへ進む | 続く | 特定のデータだけ除外したいとき |
| break | ループそのものを終了する | 終了する | 目的のデータが見つかったら処理を終えたいとき |
たとえば、リストの中から条件に合わないデータを飛ばして処理したい場合はcontinueが向いています。
C#foreach (int score in scores)
{
if (score < 60)
{
continue;
}
Console.WriteLine("合格: " + score);
}
一方、目的のデータが見つかった時点で検索を終えたい場合はbreakが向いています。
C#foreach (string name in names)
{
if (name == "佐藤")
{
Console.WriteLine("見つかりました");
break;
}
}
4-5. returnとの違いもあわせて理解する
continueやbreakと似たものに、returnがあります。returnは、メソッドの処理そのものを終了します。
C#void CheckNumbers()
{
for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
return;
}
Console.WriteLine(i);
}
Console.WriteLine("ループ終了");
}
実行結果は次のようになります。
C#1
2
iが3になった時点でreturnが実行され、メソッド全体が終了します。そのため、ループの後ろにあるConsole.WriteLine("ループ終了");も実行されません。
違いを整理すると、次のようになります。
| 命令 | 終了・スキップする範囲 |
|---|---|
| continue | 現在のループ1回分をスキップ |
| break | ループ全体を終了 |
| return | メソッド全体を終了 |
5. continue文を使うときの注意点
5-1. while文では無限ループに注意する
while文でcontinueを使う場合は、カウンターの更新位置に注意が必要です。
次のコードは危険な例です。
C#int i = 0;
while (i < 5)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
i++;
}
このコードでは、iが3になるとcontinueが実行されます。しかし、i++が実行されないため、iはずっと3のままです。その結果、無限ループになります。
正しくは、次のようにcontinueより前でi++を実行します。
C#int i = 0;
while (i < 5)
{
i++;
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
while文では、ループ条件に関係する変数を確実に更新することが重要です。
5-2. continueの後ろに書いた処理は実行されない
continue文が実行されると、その下に書いた処理は実行されません。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
continue;
Console.WriteLine("ここは実行されません");
}
Console.WriteLine(i);
}
このように、continueの直後に処理を書いても実行されません。場合によってはコンパイルエラーになることもあります。
continueの後ろには、同じブロック内で実行したい処理を書かないようにしましょう。
5-3. ネストしたループでは内側のループにだけ作用する
ループの中にループがある構造を、ネストしたループと呼びます。ネストしたループの内側でcontinueを使うと、基本的には内側のループにだけ作用します。
C#for (int i = 1; i <= 2; i++)
{
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
continue;
}
Console.WriteLine($"i={i}, j={j}");
}
}
実行結果は次のようになります。
C#i=1, j=1
i=1, j=3
i=2, j=1
i=2, j=3
jが2のときだけ、内側のループの処理がスキップされています。外側のiのループがスキップされるわけではありません。
5-4. switch文単体ではcontinueを使えない
continue文はループの中で使う命令です。そのため、switch文だけの中では使えません。
C#int number = 1;
switch (number)
{
case 1:
continue; // エラー
}
ただし、switch文がループの中にある場合は、continueを使えます。その場合、continueはswitchではなく、外側のループに対して作用します。
C#for (int i = 1; i <= 3; i++)
{
switch (i)
{
case 2:
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
C#1
3
iが2のとき、外側のfor文の次の繰り返しへ進みます。
5-5. continueを多用すると処理の流れが読みにくくなる
continue文は便利ですが、多用するとコードの流れが追いにくくなることがあります。
C#foreach (string item in items)
{
if (item == null)
{
continue;
}
if (item.Length < 3)
{
continue;
}
if (item.StartsWith("#"))
{
continue;
}
Console.WriteLine(item);
}
このように条件が多い場合は、読みやすいこともありますが、複雑になりすぎると「どの条件で処理されるのか」がわかりにくくなります。
条件が増えすぎる場合は、判定処理をメソッドに分けると読みやすくなります。
C#foreach (string item in items)
{
if (!IsValid(item))
{
continue;
}
Console.WriteLine(item);
}
bool IsValid(string item)
{
if (string.IsNullOrEmpty(item))
{
return false;
}
if (item.Length < 3)
{
return false;
}
if (item.StartsWith("#"))
{
return false;
}
return true;
}
continueは便利な命令ですが、コード全体の読みやすさを意識して使うことが大切です。
6. ネストしたループでのcontinue文の使い方
6-1. 二重ループでcontinueを使うとどう動くか
二重ループとは、ループの中にさらにループがある構造です。
C#for (int i = 1; i <= 2; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.WriteLine($"i={i}, j={j}");
}
}
実行結果は次のようになります。
C#i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
ここで内側のループにcontinueを入れてみます。
C#for (int i = 1; i <= 2; i++)
{
for (int j = 1; j <= 3; j++)
{
if (j == 2)
{
continue;
}
Console.WriteLine($"i={i}, j={j}");
}
}
実行結果は次のとおりです。
C#i=1, j=1
i=1, j=3
i=2, j=1
i=2, j=3
jが2のときだけ、内側のループの処理がスキップされています。
6-2. 内側のループだけスキップされるケース
ネストしたループでcontinueを使うと、そのcontinueが書かれている一番近いループに作用します。
C#for (int row = 1; row <= 3; row++)
{
for (int col = 1; col <= 3; col++)
{
if (col == 2)
{
continue;
}
Console.WriteLine($"row={row}, col={col}");
}
}
実行結果は次のようになります。
C#row=1, col=1
row=1, col=3
row=2, col=1
row=2, col=3
row=3, col=1
row=3, col=3
col == 2のときにスキップされるのは、内側のfor文の現在の回だけです。外側のrowの処理まで飛ばすわけではありません。
6-3. 外側のループをスキップしたい場合の考え方
C#のcontinue文には、Javaなどにあるラベル付きcontinueのような仕組みはありません。そのため、内側のループから直接「外側のループの次の回へ進む」といった書き方はできません。
外側のループをスキップしたい場合は、フラグ変数を使う方法があります。
C#for (int i = 1; i <= 3; i++)
{
bool skipOuter = false;
for (int j = 1; j <= 3; j++)
{
if (i == 2 && j == 2)
{
skipOuter = true;
break;
}
Console.WriteLine($"i={i}, j={j}");
}
if (skipOuter)
{
continue;
}
Console.WriteLine($"i={i} の処理完了");
}
この例では、内側のループで特定の条件になったときにskipOuterをtrueにし、breakで内側のループを抜けています。その後、外側のループ側でcontinueを実行しています。
ただし、こうした処理は少し複雑になりやすいため、必要に応じてメソッドに分けることも検討しましょう。
6-4. ネストが深いときは処理を分けて読みやすくする
ループのネストが深くなり、さらにcontinueやbreakが増えると、コードの流れを理解しにくくなります。
読みにくい例です。
C#foreach (var user in users)
{
if (user == null)
{
continue;
}
foreach (var order in user.Orders)
{
if (order == null)
{
continue;
}
if (order.Amount <= 0)
{
continue;
}
Console.WriteLine(order.Amount);
}
}
このような場合は、処理をメソッドに分けると読みやすくなります。
C#foreach (var user in users)
{
if (user == null)
{
continue;
}
PrintValidOrders(user);
}
void PrintValidOrders(User user)
{
foreach (var order in user.Orders)
{
if (order == null)
{
continue;
}
if (order.Amount <= 0)
{
continue;
}
Console.WriteLine(order.Amount);
}
}
さらに、判定処理をメソッドに分けることもできます。
C#bool IsValidOrder(Order order)
{
return order != null && order.Amount > 0;
}
ネストが深くなる場合は、continueだけで解決しようとせず、処理の分割も考えるとよいでしょう。
7. continue文を使うべき場面・使わないほうがよい場面
7-1. 条件に合わないデータを早めに除外したいとき
continue文が特に役立つのは、条件に合わないデータを早めに除外したいときです。
C#foreach (int score in scores)
{
if (score < 0)
{
continue;
}
Console.WriteLine(score);
}
この例では、マイナスの値を不正なデータとしてスキップしています。
先に不要なデータを除外することで、その後の処理をシンプルに書けます。
C#foreach (string name in names)
{
if (string.IsNullOrWhiteSpace(name))
{
continue;
}
Console.WriteLine(name.Trim());
}
nullや空文字を先にスキップしておくと、後続の処理で安全に文字列を扱えます。
7-2. ネストを浅くしてコードを読みやすくしたいとき
continue文は、ネストを浅くする目的でも使えます。
continueを使わない場合、次のようにif文の中に処理を書くことがあります。
C#foreach (int score in scores)
{
if (score >= 60)
{
Console.WriteLine("合格: " + score);
}
}
これでも問題ありませんが、条件が増えるとネストが深くなりやすくなります。
continueを使うと、条件に合わないものを先に除外できます。
C#foreach (int score in scores)
{
if (score < 60)
{
continue;
}
Console.WriteLine("合格: " + score);
}
この書き方は、早期リターンに近い考え方です。「処理しないものを先に除外し、メインの処理を後に書く」ことで、コードの見通しがよくなる場合があります。
7-3. 処理の分岐が複雑になる場合は使いすぎに注意
continue文は便利ですが、複雑な条件分岐に何度も使うと、かえって読みにくくなることがあります。
C#foreach (var item in items)
{
if (item == null)
{
continue;
}
if (!item.IsActive)
{
continue;
}
if (item.Price <= 0)
{
continue;
}
if (item.Category == "停止中")
{
continue;
}
Console.WriteLine(item.Name);
}
このようなコードは、条件が増えるほど「どのデータが処理されるのか」を把握しにくくなります。
その場合は、判定をひとつのメソッドにまとめると読みやすくなります。
C#foreach (var item in items)
{
if (!CanProcess(item))
{
continue;
}
Console.WriteLine(item.Name);
}
bool CanProcess(Item item)
{
return item != null
&& item.IsActive
&& item.Price > 0
&& item.Category != "停止中";
}
continueを使うべきかどうかは、「コードが読みやすくなるか」を基準に判断するとよいでしょう。
7-4. LINQやfilter処理で代替できるケース
C#では、LINQを使って条件に合うデータだけを取り出すこともできます。単純なフィルタリングであれば、continueではなくLINQのWhereを使うと読みやすくなる場合があります。
C#List<int> scores = new List<int> { 80, 45, 90, 30, 70 };
foreach (int score in scores.Where(score => score >= 60))
{
Console.WriteLine(score);
}
このコードでは、60点以上のデータだけを取り出して処理しています。continueを使った場合と比べて、処理対象が明確になります。
continueを使った場合は次のようになります。
C#foreach (int score in scores)
{
if (score < 60)
{
continue;
}
Console.WriteLine(score);
}
どちらがよいかは状況によります。
単純にデータを絞り込むだけならLINQが向いています。一方、ループの中で複数の処理を行いながら、途中でスキップしたい場合はcontinueが向いています。
8. C# continue文でよくあるエラー・疑問
8-1. continue文はループ外で使える?
continue文はループ外では使えません。for、foreach、while、do-whileなどのループ内でのみ使えます。
次のコードはエラーになります。
C#int number = 10;
if (number > 0)
{
continue; // エラー
}
if文は条件分岐であり、ループではありません。そのため、continueを使うことはできません。
正しくは、ループの中で使います。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
8-2. continue文の後のコードが実行されないのはなぜ?
continue文は、現在の繰り返し処理をそこで終了し、次の繰り返しへ進む命令です。そのため、continueの後ろにあるコードは実行されません。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
continue;
}
Console.WriteLine(i);
}
この場合、iが2のときはcontinueが実行されるため、Console.WriteLine(i);は実行されません。
実行結果は次のようになります。
C#1
3
continueの後に実行したい処理がある場合は、continueより前に書く必要があります。
C#for (int i = 1; i <= 3; i++)
{
if (i == 2)
{
Console.WriteLine("2をスキップします");
continue;
}
Console.WriteLine(i);
}
8-3. foreachでcontinueを使っても要素は削除される?
foreach文でcontinueを使っても、配列やリストの要素が削除されるわけではありません。
continueは、現在の要素に対する処理をスキップするだけです。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
foreach (string name in names)
{
if (name == "佐藤")
{
continue;
}
Console.WriteLine(name);
}
実行結果は次のようになります。
C#田中
鈴木
このコードでは"佐藤"が表示されないだけで、リストから削除されたわけではありません。
ループ後に確認すると、リストにはそのまま残っています。
C#Console.WriteLine(names.Count);
実行結果は次のようになります。
C#3
要素を削除したい場合は、RemoveやRemoveAllなど別の方法を使う必要があります。
8-4. try-catch-finally内でcontinueを使うとどうなる?
try-catch-finallyの中でも、ループ内であればcontinue文を使えます。ただし、finallyブロックがある場合は、continueで次のループへ進む前にfinallyが実行されます。
C#for (int i = 1; i <= 3; i++)
{
try
{
if (i == 2)
{
continue;
}
Console.WriteLine($"try: {i}");
}
finally
{
Console.WriteLine($"finally: {i}");
}
}
実行結果は次のようになります。
C#try: 1
finally: 1
finally: 2
try: 3
finally: 3
iが2のとき、continueによってtry内の後続処理はスキップされます。しかし、次のループへ進む前にfinallyは実行されます。
ファイルのクローズや後片付けなど、必ず実行したい処理がある場合にfinallyが使われます。
8-5. continueとgotoはどう違う?
continueとgotoは、どちらも処理の流れを変える命令ですが、用途が大きく異なります。
continueは、ループの現在の繰り返しをスキップして次の繰り返しへ進むための命令です。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
一方、gotoは指定したラベルへ処理を移動する命令です。
C#int number = 1;
if (number == 1)
{
goto Label;
}
Console.WriteLine("ここはスキップされます");
Label:
Console.WriteLine("ラベルに移動しました");
gotoは処理の流れがわかりにくくなりやすいため、通常のプログラムではあまり使われません。
ループ内で特定の処理をスキップしたいだけなら、gotoではなくcontinueを使うほうが自然です。
まとめ
C#のcontinue文は、ループ処理の中で「現在の処理をスキップして次の繰り返しへ進む」ための命令です。for文、foreach文、while文、do-while文で使うことができ、特定の条件に当てはまるデータだけを除外したいときに役立ちます。
continueとbreakは混同しやすいですが、役割は異なります。continueは現在の繰り返しだけをスキップし、ループは続行します。一方、breakはループそのものを終了します。また、returnはメソッド全体を終了する命令です。
continue文を使うと、不要なデータを早めに除外できるため、コードのネストを浅くして読みやすくできる場合があります。ただし、多用すると処理の流れがわかりにくくなることもあるため、使いすぎには注意が必要です。
特にwhile文で使う場合は、カウンターの更新位置に注意しましょう。continueによって更新処理が飛ばされると、無限ループになる可能性があります。
C#でループ処理を書くときは、処理を続けるべきか、スキップすべきか、終了すべきかを意識することが大切です。特定の条件だけを飛ばしたい場合はcontinue、ループを完全に終わらせたい場合はbreak、メソッド自体を終わらせたい場合はreturnを使い分けましょう。

