※ この記事にはアフィリエイトリンクが含まれます
C#で繰り返し処理を書くときに、forとforeachのどちらを使えばよいか迷っていませんか?
よくある詰まりポイントは次の通りです。
- 配列やリストを扱うときに、どちらが安全か分からない
- foreachで要素を変更したらどうなるか不安
- パフォーマンスやインデックスが必要な状況での選び方が分からない
結論から言うと、基本はforeachを使い、インデックス操作やコレクションの変更が必要なときはforを使います。
- 読み取り専用で要素を順に処理するならforeachが簡潔で安全
- 要素にインデックスでアクセスしたい、要素の置換や削除をするならforが適切
- パフォーマンスに厳しい場面では配列やSpanなどを検討する
この記事では、C#のforとforeachの違いを初心者向けにわかりやすく説明します。
基本的な使い方、よくある誤解、実際のコード例、注意点まで順に解説しますので、どちらを選べばよいかが明確になります。
C#での繰り返し処理の基本
まずはforとforeachの役割を簡単に整理します。
両方とも指定回数や全要素に対して処理を繰り返すための構文です。
forの特徴
forはループ変数(インデックス)を自分で管理します。
ループ回数が既知で、インデックスを使った処理に向いています。
foreachの特徴
foreachは列挙子(IEnumerator)を内部で使って要素を順に取得します。
コレクションの全要素を読み取る処理に向いていて、コードがシンプルになります。
基本的な書き方と直感的な違い
実際のコードを見れば違いが分かりやすいです。まずは配列を使った例を示します。
// for の例
int[] nums = {1, 2, 3, 4, 5};
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
// foreach の例
foreach (int n in nums)
{
Console.WriteLine(n);
}
forはインデックスiを使って要素にアクセスします。
foreachは順にnを取り出して処理します。コードが短く読みやすいのが利点です。
よくある誤解と注意点
初心者が戸惑いやすいポイントを順に説明します。
foreachで要素を変更できるか
foreachのループ変数は読み取り専用の値コピーです。
したがって値型(intなど)を直接変更しても元の配列やリストは変わりません。
int[] a = {1,2,3};
foreach (int x in a)
{
x = x + 1; // コンパイルは通るが配列aは変わらない
}参照型のプロパティを変更する場合は、オブジェクトの内部状態は変わりますが、要素自体の置換はできません。
コレクションの変更と例外
foreach中にコレクションを追加・削除するとInvalidOperationExceptionになります。
コレクションを安全に変更するには、forを使うか一時リストを作成してください。
// NG: foreach中に要素を削除
List<int> list = new List<int>{1,2,3};
// foreach (var v in list) { if (v==2) list.Remove(v); } // 例外
// 安全な方法: for を逆向きに回す
for (int i = list.Count - 1; i >= 0; i--)
{
if (list[i] == 2) list.RemoveAt(i);
}
</int></int>どちらを選ぶべきか:ケース別ガイド
具体的な状況別に選び方をまとめます。
読み取り専用で順次処理する場合
この場合はforeachが第一選択です。コードが短く安全です。
例: ログ出力や集計など、要素を変更しない処理。
インデックスが必要な場合
インデックスが必要ならforを使います。要素を条件で置換する場合もforが便利です。
例: 先頭から何番目の要素を参照・置換する処理。
コレクションを変更する場合
コレクションの要素を追加・削除するならforや逆向きループを使ってください。
foreachは列挙中の変更に弱いため避けます。
パフォーマンス観点での違い
多くの場合、差は小さいですが注意点があります。
配列に対してはforの方が若干速いことがあります。
これはforeachが列挙子を作るオーバーヘッドを持つためです。
大規模データやホットループ
大量の要素を処理するホットパスでは、配列とforの組み合わせが有利な場合があります。
また、C# 7.3以降のSpan
// 配列をforで処理する例(高速化の基本)
int[] data = GetLargeArray();
for (int i = 0; i < data.Length; i++)
{
data[i] = Process(data[i]);
}
実践的なヒントとチェックリスト
選択に迷ったら、次のチェックを順に試してください。
- 要素を変更するか? Yes→for、No→foreach
- インデックスが必要か? Yes→for
- コレクションをループ中に変更するか? Yes→forまたは一時リスト
- パフォーマンスが重要か? 配列+forやSpanを検討
さらに読みやすさと保守性を優先するのも重要です。
単純な読み取り処理はforeachで書いた方がバグが減ります。
まとめ:C# for と foreach の違いを整理
ここまでのポイントを簡潔にまとめます。
- foreachは読み取り専用でシンプル。列挙に最適。
- forはインデックス操作やコレクション変更に適する。
- パフォーマンス差は状況次第。ホットループでは配列+forやSpanを検討する。
C# for foreach 違いを理解すると、可読性と性能のバランスを取れるようになります。
この記事を参考に、最適な繰り返し構文を選んでください。実際のコードに当てはめると理解が深まります。

エンジニアとして、もっと自分の力を活かしたいあなたへ
「このまま今の職場にいて、成長できるんだろうか?」
C#を使っている方なら、一度はそう感じたことがあるかもしれません。
実は今、C#/.NETエンジニアの市場価値は高まっており、
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。
もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。
現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

ここまで読んでいただきありがとうございました。
コメント