C# while文の使い方を初心者向けに解説|基本構文・do whileとの違い・無限ループ対策まで
はじめに
C#で同じ処理を何度も繰り返したいときに使う代表的な構文のひとつがwhile文です。while文は、指定した条件が成り立っている間だけ処理を繰り返す仕組みで、ユーザー入力の受付、特定条件を満たすまでの処理、カウンターを使った反復処理など、さまざまな場面で利用されます。
ただし、C#のwhile文は便利な反面、条件式や変数の更新を間違えると無限ループになってしまうことがあります。初心者のうちは「いつ使えばよいのか」「for文やdo while文と何が違うのか」「breakやcontinueはどう使うのか」で迷いやすいポイントも多いです。
この記事では、C#のwhile文について、基本構文からサンプルコード、do while文やfor文との違い、無限ループ対策、初心者がつまずきやすいエラーまでわかりやすく解説します。
1. C#のwhile文とは?初心者向けにわかりやすく解説
1-1. while文は条件がtrueの間だけ処理を繰り返す構文
C#のwhile文は、条件式がtrueの間、同じ処理を繰り返すための構文です。
たとえば「変数countが5以下の間だけ表示を続ける」といった処理を書くときに使います。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
このコードでは、count <= 5がtrueである間、Console.WriteLine(count);が繰り返し実行されます。countが6になると条件式がfalseになるため、ループは終了します。
1-2. 「繰り返し回数が決まっていない処理」に向いている
while文は、あらかじめ繰り返し回数がはっきり決まっていない処理に向いています。
たとえば、次のような処理です。
C#string input = "";
while (input != "exit")
{
Console.Write("終了するには exit と入力してください: ");
input = Console.ReadLine();
}
この例では、ユーザーがexitと入力するまで処理を繰り返します。何回入力されるかは実行してみないとわからないため、while文が適しています。
一方で、「1から10まで繰り返す」のように回数が明確に決まっている場合は、for文の方が読みやすくなることもあります。
1-3. C#でwhile文を使う主な場面
C#でwhile文を使う主な場面には、次のようなものがあります。
ユーザーが特定の値を入力するまで処理を続ける場合、条件が満たされるまで計算を続ける場合、ファイルやデータを順番に読み込む場合、ゲームループのように一定条件の間だけ処理を継続する場合などです。
たとえば、ユーザー入力を繰り返し受け付ける処理では、終了条件がユーザーの操作によって決まります。このようなケースでは、while文を使うと自然に書けます。
C#string command = "";
while (command != "quit")
{
Console.Write("コマンドを入力してください: ");
command = Console.ReadLine();
Console.WriteLine($"入力されたコマンド: {command}");
}
1-4. この記事で学べること
この記事では、C#のwhile文について次の内容を学べます。
while文の基本構文、条件式の考え方、サンプルコードを使った実践的な使い方、breakとcontinueの使い方、do while文との違い、for文やforeach文との使い分け、無限ループを防ぐ方法、初心者がつまずきやすいエラー、実務で使うときのベストプラクティスを順番に解説します。
2. C# while文の基本構文と書き方
2-1. while文の基本構文
C#のwhile文は、次のように書きます。
C#while (条件式)
{
繰り返したい処理;
}
条件式がtrueの場合、{}の中の処理が実行されます。処理が終わると、もう一度条件式を判定します。そして、条件式がtrueである限り、処理を繰り返します。
条件式がfalseになった時点で、while文は終了します。
C#int number = 1;
while (number <= 3)
{
Console.WriteLine(number);
number++;
}
実行結果は次のようになります。
1
2
3
2-2. 条件式の書き方とtrue・falseの考え方
while文の条件式には、結果がbool型、つまりtrueまたはfalseになる式を書きます。
たとえば、次のような条件式が使えます。
C#count < 10
name != "end"
isRunning == true
items.Count > 0
C#では、while文の条件式に数値をそのまま書くことはできません。
C#// C#ではエラー
while (1)
{
}
CやC++では1を真として扱える場合がありますが、C#では条件式には必ずbool型の式を書く必要があります。
正しくは次のように書きます。
C#while (true)
{
break;
}
また、bool型の変数を使う場合は、次のように書けます。
C#bool isRunning = true;
while (isRunning)
{
Console.WriteLine("実行中です");
isRunning = false;
}
2-3. 処理ブロック{}の中に書く内容
while文の{}の中には、繰り返し実行したい処理を書きます。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine($"現在の値: {count}");
count++;
}
この例では、次の2つの処理が繰り返されます。
C#Console.WriteLine($"現在の値: {count}");
count++;
特に重要なのは、ループがいつか終了するように、条件に関係する変数を更新することです。
上の例では、count++によってcountの値が1ずつ増えます。もしcount++を書き忘れると、countはずっと1のままになり、count <= 5が常にtrueになって無限ループが発生します。
2-4. while文の実行順序を図解で理解する
while文は、次の順番で実行されます。
1. 条件式を判定する
2. 条件式がtrueなら{}内の処理を実行する
3. 処理が終わったら再び条件式を判定する
4. 条件式がtrueならもう一度処理する
5. 条件式がfalseになったらwhile文を終了する
流れを簡単に表すと、次のようになります。
条件式を確認
↓
true → 処理を実行 → 条件式を再確認
↓
false
↓
while文を終了
ポイントは、while文では最初に条件式を判定することです。そのため、最初から条件式がfalseの場合、{}の中の処理は1回も実行されません。
2-5. 最小サンプルコードで動きを確認する
まずは、最小限のサンプルコードでwhile文の動きを確認しましょう。
C#int i = 0;
while (i < 3)
{
Console.WriteLine("Hello");
i++;
}
実行結果は次のとおりです。
Hello
Hello
Hello
このコードの流れは次のようになります。
i = 0 → i < 3 は true → Helloを表示 → iは1になる
i = 1 → i < 3 は true → Helloを表示 → iは2になる
i = 2 → i < 3 は true → Helloを表示 → iは3になる
i = 3 → i < 3 は false → ループ終了
このように、while文では「条件式」「処理」「変数の更新」の3つを意識することが大切です。
3. C# while文の使い方をサンプルコードで解説
3-1. カウントアップしながら繰り返す基本例
カウントアップとは、数値を1ずつ増やしながら処理を繰り返すことです。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
count++;
}
実行結果は次のようになります。
1
2
3
4
5
count++は、countの値を1増やす処理です。
C#count++;
これは次のコードと同じ意味です。
C#count = count + 1;
while文でカウンターを使う場合は、初期値、条件式、更新処理をセットで考えると理解しやすくなります。
C#int count = 1; // 初期値
while (count <= 5) // 条件式
{
Console.WriteLine(count);
count++; // 更新処理
}
3-2. カウントダウンするwhile文の例
while文では、数値を増やすだけでなく、減らしながら繰り返すこともできます。
C#int count = 5;
while (count >= 1)
{
Console.WriteLine(count);
count--;
}
実行結果は次のとおりです。
5
4
3
2
1
count--は、countの値を1減らす処理です。
カウントダウンでは、条件式の向きに注意しましょう。countを減らしているのに条件式をcount <= 5のようにしてしまうと、条件がずっとtrueになり、無限ループになる可能性があります。
正しい組み合わせは次のようになります。
C#int count = 5;
while (count >= 1)
{
Console.WriteLine(count);
count--;
}
3-3. ユーザー入力を条件に繰り返す例
while文は、ユーザーが特定の文字を入力するまで処理を繰り返す場合によく使われます。
C#string input = "";
while (input != "exit")
{
Console.Write("文字を入力してください。終了するには exit と入力: ");
input = Console.ReadLine();
Console.WriteLine($"入力内容: {input}");
}
Console.WriteLine("終了しました。");
このコードでは、ユーザーがexitと入力するまで、入力受付を繰り返します。
文字を入力してください。終了するには exit と入力: hello
入力内容: hello
文字を入力してください。終了するには exit と入力: test
入力内容: test
文字を入力してください。終了するには exit と入力: exit
入力内容: exit
終了しました。
ユーザー入力は事前に回数がわからないため、while文に向いています。
3-4. 条件を満たすまで処理を続ける例
ある条件を満たすまで計算や処理を続けたい場合にも、while文が使えます。
次の例では、合計値が100以上になるまで数値を足していきます。
C#int sum = 0;
int number = 1;
while (sum < 100)
{
sum += number;
Console.WriteLine($"number: {number}, sum: {sum}");
number++;
}
Console.WriteLine("合計が100以上になりました。");
sum < 100がtrueである間、処理が繰り返されます。sumが100以上になると条件式がfalseになり、ループが終了します。
このように、終了条件が「何回繰り返すか」ではなく「ある状態になったか」で決まる場合、while文が便利です。
3-5. 配列やリストをwhile文で処理する例
配列やリストの要素を順番に処理する場合にも、while文を使えます。
配列の例です。
C#string[] fruits = { "Apple", "Banana", "Orange" };
int index = 0;
while (index < fruits.Length)
{
Console.WriteLine(fruits[index]);
index++;
}
実行結果は次のようになります。
Apple
Banana
Orange
リストの場合は、Countプロパティを使います。
C#List<string> names = new List<string> { "佐藤", "鈴木", "田中" };
int index = 0;
while (index < names.Count)
{
Console.WriteLine(names[index]);
index++;
}
ただし、配列やリストを最初から最後まで処理するだけなら、foreach文の方が読みやすいことが多いです。
C#foreach (string name in names)
{
Console.WriteLine(name);
}
while文は、インデックスを細かく制御したい場合や、途中で条件によって進め方を変えたい場合に向いています。
4. while文でよく使うbreak・continueの使い方
4-1. breakでループを途中終了する
breakは、ループを途中で終了したいときに使います。
C#int count = 1;
while (count <= 10)
{
if (count == 5)
{
break;
}
Console.WriteLine(count);
count++;
}
実行結果は次のようになります。
1
2
3
4
countが5になった時点でbreakが実行され、while文が終了します。そのため、5以降は表示されません。
breakは、条件式がまだtrueであっても、強制的にループを抜けるために使います。
4-2. continueで現在の処理をスキップする
continueは、現在のループ処理を途中でスキップし、次の繰り返しに進むために使います。
C#int count = 0;
while (count < 5)
{
count++;
if (count == 3)
{
continue;
}
Console.WriteLine(count);
}
実行結果は次のとおりです。
1
2
4
5
countが3のとき、continueによってその後のConsole.WriteLine(count);がスキップされます。そのため、3は表示されません。
continueを使うときは、カウンター変数の更新位置に注意が必要です。更新処理より前にcontinueを書いてしまうと、変数が更新されずに無限ループになることがあります。
4-3. breakとcontinueの違い
breakとcontinueは似ていますが、役割が異なります。
breakはループそのものを終了します。
C#while (true)
{
break;
}
一方、continueは現在の1回分の処理だけをスキップして、次のループに進みます。
C#while (条件式)
{
continue;
}
簡単にまとめると、breakは「もうループを終わる」、continueは「今回はここで飛ばして次に進む」という意味です。
4-4. while(true)とbreakを組み合わせる使い方
while(true)は、条件式が常にtrueになるため、そのままでは無限ループになります。
ただし、ループ内でbreakを使って終了条件を明確にすれば、安全に使える場合があります。
C#while (true)
{
Console.Write("数値を入力してください。終了するには 0 を入力: ");
int number = int.Parse(Console.ReadLine());
if (number == 0)
{
break;
}
Console.WriteLine($"入力された数値: {number}");
}
Console.WriteLine("終了しました。");
このコードでは、while(true)によって入力受付を繰り返しますが、ユーザーが0を入力するとbreakでループを終了します。
while(true)を使う場合は、「どの条件で抜けるのか」を必ず明確にしましょう。
4-5. break・continueを使うときの注意点
breakやcontinueは便利ですが、使いすぎると処理の流れがわかりにくくなることがあります。
特に、複数の条件でbreakが実行されるコードは、どこでループが終了するのか読み取りにくくなります。
C#while (true)
{
if (条件A)
{
break;
}
if (条件B)
{
break;
}
if (条件C)
{
break;
}
}
このような場合は、終了条件を整理したり、処理をメソッドに分けたりすると可読性が上がります。
また、continueを使う場合は、カウンター変数の更新を忘れないように注意しましょう。
C#int i = 0;
while (i < 10)
{
if (i == 5)
{
continue; // iが更新されないため無限ループになる
}
i++;
}
この例では、iが5になったときにcontinueが実行され、i++が実行されません。その結果、iは5のままになり、無限ループになります。
修正するなら、次のように更新処理をcontinueより前に書きます。
C#int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
continue;
}
Console.WriteLine(i);
}
5. C#のwhile文とdo while文の違い
5-1. do while文の基本構文
C#には、while文に似た構文としてdo while文があります。
do while文の基本構文は次のとおりです。
C#do
{
繰り返したい処理;
}
while (条件式);
do while文では、まずdoブロック内の処理を実行し、その後で条件式を判定します。
C#int count = 1;
do
{
Console.WriteLine(count);
count++;
}
while (count <= 5);
実行結果は次のようになります。
1
2
3
4
5
5-2. while文は条件判定が先、do while文は処理が先
while文とdo while文の大きな違いは、条件判定のタイミングです。
while文は、最初に条件式を判定します。
C#while (条件式)
{
処理;
}
一方、do while文は、先に処理を実行してから条件式を判定します。
C#do
{
処理;
}
while (条件式);
つまり、while文は「条件を確認してから実行する」、do while文は「まず実行してから続けるか確認する」という違いがあります。
5-3. while文は0回実行、do while文は最低1回実行される
while文は、最初から条件式がfalseの場合、1回も処理が実行されません。
C#int count = 10;
while (count < 5)
{
Console.WriteLine("while文です");
}
このコードでは、count < 5が最初からfalseなので、何も表示されません。
一方、do while文は、条件式がfalseでも最低1回は処理が実行されます。
C#int count = 10;
do
{
Console.WriteLine("do while文です");
}
while (count < 5);
実行結果は次のようになります。
do while文です
このように、処理を最低1回は実行したい場合は、do while文が向いています。
5-4. while文とdo while文の使い分け
while文とdo while文は、次のように使い分けるとわかりやすいです。
条件を満たす場合だけ処理したいならwhile文を使います。
C#while (在庫がある)
{
商品を処理する;
}
一方、最初の1回は必ず処理したいならdo while文を使います。
C#do
{
メニューを表示する;
}
while (終了が選ばれていない);
ユーザーにメニューを表示して入力を受け付ける処理では、少なくとも1回はメニューを表示する必要があるため、do while文が使いやすい場合があります。
5-5. サンプルコードで違いを比較する
while文とdo while文の違いをコードで比較してみましょう。
まずはwhile文です。
C#int number = 10;
while (number < 5)
{
Console.WriteLine("while文の処理");
}
このコードは何も表示しません。最初にnumber < 5を判定し、falseになるためです。
次にdo while文です。
C#int number = 10;
do
{
Console.WriteLine("do while文の処理");
}
while (number < 5);
実行結果は次のようになります。
do while文の処理
do while文では、条件式を判定する前に処理が1回実行されます。
この違いを理解しておくと、ユーザー入力やメニュー処理を書くときに適切な構文を選びやすくなります。
6. while文とfor文・foreach文の違い
6-1. while文とfor文の違い
while文とfor文は、どちらも繰り返し処理を書くための構文です。
while文は、条件がtrueの間だけ処理を繰り返します。
C#int i = 0;
while (i < 5)
{
Console.WriteLine(i);
i++;
}
for文は、初期化、条件式、更新処理を1行にまとめて書けます。
C#for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
どちらも同じ結果になりますが、繰り返し回数が決まっている場合はfor文の方が簡潔です。
6-2. while文とforeach文の違い
foreach文は、配列やリストなどのコレクションを順番に処理するための構文です。
C#string[] fruits = { "Apple", "Banana", "Orange" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
同じ処理をwhile文で書くと、次のようになります。
C#string[] fruits = { "Apple", "Banana", "Orange" };
int index = 0;
while (index < fruits.Length)
{
Console.WriteLine(fruits[index]);
index++;
}
foreach文はインデックスを意識せずに書けるため、コレクションの全要素を処理するだけならforeach文が向いています。
一方で、インデックスを使って特定の位置から処理したい場合や、条件によって進み方を変えたい場合はwhile文が役立ちます。
6-3. 回数が決まっているならfor文が向いている
「10回繰り返す」「配列の要素数だけ繰り返す」のように、繰り返し回数が明確に決まっている場合はfor文が向いています。
C#for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
for文では、初期化、条件式、更新処理が1行にまとまるため、カウンターを使った処理の意図がわかりやすくなります。
同じ処理をwhile文で書くと次のようになります。
C#int i = 1;
while (i <= 10)
{
Console.WriteLine(i);
i++;
}
どちらでも書けますが、単純な回数指定のループであれば、for文の方が読みやすいことが多いです。
6-4. コレクション処理ならforeach文が向いている
配列やリストのすべての要素を順番に処理するだけなら、foreach文が向いています。
C#List<string> users = new List<string> { "Aki", "Ken", "Mika" };
foreach (string user in users)
{
Console.WriteLine(user);
}
foreach文では、インデックスの初期化や更新を自分で書く必要がありません。そのため、インデックスの更新忘れによる無限ループも起こりにくくなります。
ただし、要素の位置番号が必要な場合や、途中で複雑な条件判定をしながら処理したい場合は、while文やfor文を使うこともあります。
6-5. どの繰り返し構文を選ぶべきか
C#で繰り返し構文を選ぶときは、処理の目的に合わせて考えるとわかりやすいです。
繰り返し回数が決まっていない場合はwhile文が向いています。たとえば、ユーザーが特定の入力をするまで繰り返す処理です。
繰り返し回数が決まっている場合はfor文が向いています。たとえば、1から10まで表示する処理です。
配列やリストの要素を順番に処理する場合はforeach文が向いています。
処理を最低1回は実行したい場合はdo while文が向いています。
このように、それぞれの特徴を理解して使い分けることで、読みやすく安全なC#コードを書けるようになります。
7. C# while文の無限ループ対策
7-1. 無限ループとは何か
無限ループとは、ループの終了条件が満たされず、処理が終わらずに繰り返され続ける状態のことです。
たとえば、次のコードは無限ループになります。
C#int count = 1;
while (count <= 5)
{
Console.WriteLine(count);
}
このコードでは、countの値が変わりません。countはずっと1のままなので、count <= 5が常にtrueになり、ループが終わりません。
無限ループが起きると、プログラムが止まらなくなったり、CPU使用率が高くなったり、アプリケーションが応答しなくなったりすることがあります。
7-2. while文で無限ループが起きる原因
while文で無限ループが起きる主な原因は、条件式がいつまでもfalseにならないことです。
よくある原因は次のようなものです。
カウンター変数の更新を忘れている、条件式の比較演算子を間違えている、更新する変数と条件式で使っている変数が違う、continueによって更新処理がスキップされている、while(true)に終了条件を書いていない、などです。
たとえば、次のコードはiを更新しているつもりでも、条件式ではcountを使っているため、意図どおりに動きません。
C#int count = 0;
int i = 0;
while (count < 5)
{
Console.WriteLine(i);
i++;
}
この場合、countはずっと0のままなので、count < 5が常にtrueになります。
7-3. 変数の更新忘れによる無限ループ
初心者が特にやりやすいミスが、変数の更新忘れです。
C#int i = 0;
while (i < 10)
{
Console.WriteLine(i);
}
このコードでは、iが増えないため、i < 10がずっとtrueのままです。
正しくは、ループ内でi++を書きます。
C#int i = 0;
while (i < 10)
{
Console.WriteLine(i);
i++;
}
while文を書くときは、条件式に使っている変数がループ内で変化しているかを必ず確認しましょう。
7-4. 条件式のミスによる無限ループ
条件式の比較演算子を間違えると、無限ループになることがあります。
たとえば、カウントアップしているのに条件式をi >= 0にしてしまうと、通常はずっとtrueになります。
C#int i = 0;
while (i >= 0)
{
Console.WriteLine(i);
i++;
}
このコードでは、iが増え続けるため、i >= 0は基本的にtrueのままです。
正しくは、終了したい値を考えて条件式を書く必要があります。
C#int i = 0;
while (i < 10)
{
Console.WriteLine(i);
i++;
}
条件式を書くときは、「どの値になったら終了するのか」を先に考えるとミスを減らせます。
7-5. while(true)を安全に使う方法
while(true)は意図的に無限ループを作る書き方です。
C#while (true)
{
// 繰り返す処理
}
このままでは終了しないため、通常はbreakと組み合わせて使います。
C#while (true)
{
Console.Write("コマンドを入力してください: ");
string command = Console.ReadLine();
if (command == "exit")
{
break;
}
Console.WriteLine($"実行コマンド: {command}");
}
while(true)を安全に使うには、次の点を意識しましょう。
終了条件を必ず書くこと、breakに到達できること、異常時にも抜けられるようにすること、必要に応じて最大試行回数を設けることです。
たとえば、入力を最大3回までに制限する場合は次のように書けます。
C#int retryCount = 0;
int maxRetry = 3;
while (true)
{
Console.Write("パスワードを入力してください: ");
string password = Console.ReadLine();
if (password == "secret")
{
Console.WriteLine("ログイン成功");
break;
}
retryCount++;
if (retryCount >= maxRetry)
{
Console.WriteLine("試行回数を超えました");
break;
}
}
7-6. 無限ループを防ぐチェックポイント
while文で無限ループを防ぐには、次の点を確認しましょう。
条件式がいつかfalseになるか、条件式に使っている変数をループ内で更新しているか、更新方向と条件式が合っているか、continueによって更新処理がスキップされないか、while(true)には必ずbreakがあるか、外部入力に依存する場合は例外的な入力も考慮しているかを確認します。
特に初心者のうちは、while文を書いたら次の3つをセットで見るのがおすすめです。
C#int i = 0; // 初期化
while (i < 10) // 条件式
{
i++; // 更新
}
初期化、条件式、更新処理の3つがそろっているか確認するだけでも、多くの無限ループを防げます。
8. C# while文で初心者がつまずきやすいエラーと対処法
8-1. 条件式に代入演算子を使ってしまう
C#では、比較するときに==を使います。代入するときは=を使います。
初心者がよく間違えるのが、条件式で=を使ってしまうことです。
C#int number = 1;
// エラーになる例
while (number = 5)
{
Console.WriteLine(number);
}
C#では、number = 5の結果はint型になるため、while文の条件式として使えません。条件式にはbool型が必要です。
正しくは、比較演算子==を使います。
C#int number = 1;
while (number == 5)
{
Console.WriteLine(number);
}
ただし、この例ではnumberが1なので、ループは実行されません。
条件式で値を比較したい場合は、=ではなく==を使うと覚えておきましょう。
8-2. カウンター変数の初期化を忘れる
while文でカウンターを使う場合、ループの前に変数を初期化する必要があります。
C#// エラーになる例
while (i < 5)
{
Console.WriteLine(i);
i++;
}
このコードでは、iが宣言されていないためエラーになります。
正しくは、ループの前でiを宣言して初期値を設定します。
C#int i = 0;
while (i < 5)
{
Console.WriteLine(i);
i++;
}
変数を使う前には、必ず宣言と初期化を行いましょう。
8-3. インクリメント・デクリメントを忘れる
while文では、条件式に使う変数を更新しないと、無限ループになることがあります。
C#int i = 0;
while (i < 5)
{
Console.WriteLine(i);
}
このコードでは、iが増えないため、i < 5がずっとtrueです。
修正するには、i++を追加します。
C#int i = 0;
while (i < 5)
{
Console.WriteLine(i);
i++;
}
カウントダウンの場合は、i--を使います。
C#int i = 5;
while (i > 0)
{
Console.WriteLine(i);
i--;
}
8-4. {}の範囲を間違える
while文では、{}の中に書いた処理だけが繰り返されます。
C#int i = 0;
while (i < 3)
Console.WriteLine(i);
i++;
このコードは一見するとConsole.WriteLine(i);とi++;の両方が繰り返されるように見えます。
しかし、{}がない場合、while文の対象になるのは直後の1文だけです。つまり、実際には次のように解釈されます。
C#int i = 0;
while (i < 3)
{
Console.WriteLine(i);
}
i++;
この場合、i++がループの外にあるため、iが更新されず無限ループになります。
正しくは、必ず{}を使って範囲を明確にします。
C#int i = 0;
while (i < 3)
{
Console.WriteLine(i);
i++;
}
初心者のうちは、処理が1行だけでも{}を書く習慣をつけると安全です。
8-5. 条件式が複雑になりすぎる
while文の条件式が複雑になると、コードの意図がわかりにくくなります。
C#while ((count < 10 && isRunning) || (retryCount < 3 && !hasError))
{
// 処理
}
このような条件式は、正しく読めないとバグの原因になります。
複雑な条件は、意味のある変数に分けると読みやすくなります。
C#bool canContinue = count < 10 && isRunning;
bool canRetry = retryCount < 3 && !hasError;
while (canContinue || canRetry)
{
// 処理
canContinue = count < 10 && isRunning;
canRetry = retryCount < 3 && !hasError;
}
または、条件判定をメソッドに分ける方法もあります。
C#while (CanContinue(count, isRunning, retryCount, hasError))
{
// 処理
}
条件式は、できるだけ読みやすく保つことが大切です。
8-6. デバッグでwhile文の動きを確認する方法
while文の動きがわからないときは、デバッグを使って変数の値を確認すると理解しやすくなります。
Visual Studioなどの開発環境では、ブレークポイントを設定して1行ずつ実行できます。条件式の判定前後や、カウンター変数の更新部分に注目すると、ループの流れを確認できます。
簡単に確認したい場合は、Console.WriteLineで変数の値を表示する方法もあります。
C#int i = 0;
while (i < 5)
{
Console.WriteLine($"ループ開始: i = {i}");
i++;
Console.WriteLine($"ループ終了: i = {i}");
}
実行結果を見ることで、iがどのタイミングで増えているかがわかります。
無限ループが疑われる場合は、まず条件式に使っている変数の値を表示してみましょう。
9. C# while文を実務で使うときのベストプラクティス
9-1. 終了条件を明確に書く
実務でwhile文を使うときは、終了条件を明確に書くことが重要です。
C#while (isRunning)
{
// 処理
}
このようなコードを書く場合、isRunningがどのタイミングでfalseになるのかがわかるようにしておく必要があります。
C#bool isRunning = true;
while (isRunning)
{
string command = Console.ReadLine();
if (command == "exit")
{
isRunning = false;
}
}
終了条件が曖昧だと、後からコードを読む人が「いつ終わるのか」を理解しにくくなります。
9-2. ループ内の処理を短く保つ
while文の中に長い処理を書きすぎると、コードの見通しが悪くなります。
C#while (condition)
{
// 何十行もの処理
}
ループ内が長くなると、条件式に関係する変数がどこで更新されているのか見つけにくくなり、無限ループやバグの原因になります。
できるだけ、ループ内の処理は短く保ちましょう。
C#while (condition)
{
ProcessItem();
UpdateCondition();
}
処理の役割を分けることで、コードの意図がわかりやすくなります。
9-3. 複雑な処理はメソッドに分ける
while文の中で複雑な処理を行う場合は、メソッドに分けると読みやすくなります。
C#while (HasNextItem())
{
var item = GetNextItem();
ProcessItem(item);
}
このように書くと、while文全体の流れがわかりやすくなります。
メソッドに分ける前のコードが次のように長くなっている場合は、分割を検討しましょう。
C#while (index < items.Count)
{
// 入力チェック
// データ変換
// エラー処理
// 保存処理
// ログ出力
index++;
}
処理ごとにメソッド化することで、保守しやすいコードになります。
9-4. 可読性を重視してfor文と使い分ける
while文でもfor文でも書ける処理は多くあります。
たとえば、次のようなカウント処理はwhile文でも書けます。
C#int i = 0;
while (i < 10)
{
Console.WriteLine(i);
i++;
}
しかし、回数が決まっている場合はfor文の方が簡潔です。
C#for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
実務では「動けばよい」だけでなく、「他の人が読んで理解しやすいか」も大切です。繰り返し回数が明確な場合はfor文、終了条件が状態によって変わる場合はwhile文というように使い分けましょう。
9-5. パフォーマンスよりも安全性を優先する
while文を書くとき、初心者のうちはパフォーマンスを細かく気にするよりも、安全に終了すること、読みやすいことを優先しましょう。
たとえば、次のように最大回数を設けることで、予期しない無限ループを防げます。
C#int retry = 0;
int maxRetry = 5;
while (retry < maxRetry)
{
Console.WriteLine("処理を実行します");
bool success = TryProcess();
if (success)
{
break;
}
retry++;
}
外部サービスへの接続、ファイル読み込み、ユーザー入力など、いつ終わるかわからない処理では、最大試行回数やタイムアウトを設けると安全です。
実務では、少し冗長に見えても、予期しない動作を防げるコードの方が信頼性が高くなります。
10. C# while文の練習問題
10-1. 1から10まで表示する
まずは、while文を使って1から10まで表示してみましょう。
C#int i = 1;
while (i <= 10)
{
Console.WriteLine(i);
i++;
}
実行結果は次のようになります。
1
2
3
4
5
6
7
8
9
10
この問題では、初期値を1にし、条件式をi <= 10にするのがポイントです。
10-2. 偶数だけを表示する
1から10までの中で、偶数だけを表示する例です。
C#int i = 1;
while (i <= 10)
{
if (i % 2 == 0)
{
Console.WriteLine(i);
}
i++;
}
実行結果は次のとおりです。
2
4
6
8
10
i % 2 == 0は、iを2で割った余りが0であることを意味します。つまり、偶数かどうかを判定しています。
最初から2ずつ増やす方法もあります。
C#int i = 2;
while (i <= 10)
{
Console.WriteLine(i);
i += 2;
}
10-3. 入力された文字が特定の値になるまで繰り返す
ユーザーがendと入力するまで繰り返す例です。
C#string input = "";
while (input != "end")
{
Console.Write("文字を入力してください。終了するには end と入力: ");
input = Console.ReadLine();
Console.WriteLine($"入力値: {input}");
}
このような処理は、繰り返し回数がユーザーの入力によって変わるため、while文に向いています。
大文字と小文字を区別したくない場合は、次のように書くこともできます。
C#string input = "";
while (input.ToLower() != "end")
{
Console.Write("文字を入力してください。終了するには end と入力: ");
input = Console.ReadLine();
}
ただし、Console.ReadLine()がnullになる可能性を考慮する場合は、より安全な書き方にします。
C#string input = "";
while (input != "end")
{
Console.Write("文字を入力してください。終了するには end と入力: ");
input = Console.ReadLine() ?? "";
}
10-4. breakを使って途中でループを抜ける
breakを使って、特定の条件でループを途中終了する練習です。
C#int i = 1;
while (i <= 10)
{
if (i == 6)
{
break;
}
Console.WriteLine(i);
i++;
}
実行結果は次のようになります。
1
2
3
4
5
iが6になった時点でbreakが実行されるため、ループが終了します。
入力値を使った例も見てみましょう。
C#while (true)
{
Console.Write("コマンドを入力してください: ");
string command = Console.ReadLine();
if (command == "exit")
{
break;
}
Console.WriteLine($"コマンドを実行しました: {command}");
}
このように、while(true)とbreakを組み合わせると、ユーザーが終了コマンドを入力するまで処理を続けられます。
10-5. continueを使って特定の処理をスキップする
continueを使って、特定の値だけ処理をスキップする練習です。
C#int i = 0;
while (i < 10)
{
i++;
if (i == 5)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のとおりです。
1
2
3
4
6
7
8
9
10
iが5のとき、continueによってConsole.WriteLine(i);がスキップされるため、5だけ表示されません。
偶数だけをスキップして奇数だけ表示する例もあります。
C#int i = 0;
while (i < 10)
{
i++;
if (i % 2 == 0)
{
continue;
}
Console.WriteLine(i);
}
実行結果は次のようになります。
1
3
5
7
9
continueを使う場合は、カウンターの更新を先に行うか、スキップしても更新される位置に書くことが重要です。
11. C# while文に関するよくある質問
11-1. while文はいつ使えばいいですか?
while文は、繰り返し回数が事前に決まっていない処理で使うのがおすすめです。
たとえば、ユーザーが特定の文字を入力するまで繰り返す処理、条件を満たすまで計算を続ける処理、外部からデータを読み込み続ける処理などです。
C#string input = "";
while (input != "exit")
{
input = Console.ReadLine();
}
一方で、繰り返し回数が明確に決まっている場合は、for文の方が読みやすいことが多いです。
11-2. while文とdo while文はどちらを使うべきですか?
最初に条件を判定して、条件を満たす場合だけ処理したいならwhile文を使います。
C#while (condition)
{
// 条件がtrueのときだけ実行
}
処理を最低1回は実行したいならdo while文を使います。
C#do
{
// 最低1回は実行
}
while (condition);
たとえば、入力メニューを必ず1回表示したい場合はdo while文が便利です。条件を満たしている場合だけ処理したい場合はwhile文が自然です。
11-3. while(true)は使っても大丈夫ですか?
while(true)は使っても問題ありませんが、必ず終了条件を用意する必要があります。
C#while (true)
{
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
}
breakがないwhile(true)は無限ループになります。
また、実務では異常時に抜けられるように、最大試行回数やタイムアウトを設けることもあります。
C#int count = 0;
while (true)
{
if (count >= 5)
{
break;
}
count++;
}
while(true)を使うときは、「どの条件で終了するのか」が明確であることが重要です。
11-4. while文で複数条件を書くことはできますか?
はい、C#のwhile文では複数条件を書くことができます。
複数条件には、論理演算子の&&や||を使います。
&&は「かつ」を表します。
C#int count = 0;
bool isRunning = true;
while (count < 10 && isRunning)
{
Console.WriteLine(count);
count++;
if (count == 5)
{
isRunning = false;
}
}
この例では、count < 10かつisRunningがtrueの間だけループします。
||は「または」を表します。
C#while (count < 10 || isRunning)
{
// どちらかがtrueなら実行
}
ただし、条件式が複雑になりすぎると読みにくくなるため、必要に応じて変数やメソッドに分けるとよいです。
11-5. while文の中で変数を宣言してもいいですか?
はい、while文の中で変数を宣言しても問題ありません。
C#int i = 0;
while (i < 3)
{
string message = $"現在の値は {i} です";
Console.WriteLine(message);
i++;
}
ただし、while文の中で宣言した変数は、基本的にその{}の中でしか使えません。
C#while (true)
{
string text = "Hello";
break;
}
// ここではtextを使えない
// Console.WriteLine(text);
ループの外でも使いたい変数は、while文の前で宣言しておきます。
C#string text = "";
while (text != "end")
{
text = Console.ReadLine();
}
Console.WriteLine($"最後の入力: {text}");
変数をどこで使いたいのかを考えて、宣言する場所を決めましょう。
まとめ
C#のwhile文は、条件式がtrueの間だけ処理を繰り返すための構文です。繰り返し回数が決まっていない処理や、ユーザー入力によって終了タイミングが変わる処理に向いています。
基本構文は次のとおりです。
C#while (条件式)
{
繰り返したい処理;
}
while文では、条件式が最初に判定されます。そのため、条件式が最初からfalseの場合、処理は1回も実行されません。これに対して、do while文は処理を先に実行するため、最低1回は実行されます。
また、breakを使うとループを途中終了でき、continueを使うと現在の処理をスキップして次の繰り返しに進めます。
while文を使うときに特に注意したいのが、無限ループです。条件式に使っている変数を更新しているか、条件式がいつかfalseになるか、while(true)に終了条件があるかを確認しましょう。
回数が決まっている処理にはfor文、配列やリストの全要素を処理する場合にはforeach文、最低1回実行したい場合にはdo while文が向いています。while文だけにこだわらず、処理の目的に合わせて適切な繰り返し構文を選ぶことが大切です。
C#のwhile文を正しく理解すれば、ユーザー入力、条件付きの繰り返し、ループ制御など、さまざまなプログラムを柔軟に書けるようになります。

