※ この記事にはアフィリエイトリンクが含まれます
C#で配列を使おうとして、思った通りに動かず困っていませんか?
- 配列の宣言や初期化の書き方がわからない
- インデックスや長さでエラーになる(IndexOutOfRangeExceptionなど)
- 参照型の配列で意図せずデータが共有されてしまう
- 配列の基本的な宣言と初期化の違いが理解できない
- foreachやforの使い分けに自信がない
- 多次元配列とジャグ配列の違いが混乱する
結論から言うと、C#の配列はルールを押さえれば非常に便利で、
基本操作、ループ処理、よくある落とし穴を理解すれば確実に使いこなせます。
- まず配列の宣言・初期化の基本を覚える
- インデックスや長さの扱いに注意する
- 参照型の挙動や多次元配列の違いを把握する
この記事を読むと、配列の基礎から実践的なコツまで学べます。
サンプルコードを多数掲載するので、手を動かしながら理解できます。
配列とは何か(ポイント)
配列は同じ型の値を連続的に格納するデータ構造です。
C#では配列はSystem.Arrayを継承したオブジェクトであり、固定長です。
要素にはインデックスでアクセスし、0から始まることに注意が必要です。
配列のメリットと制約
配列はメモリ上に連続して配置されるため、インデックスアクセスが高速です。
一方でサイズ変更ができないため、要素数が変わる場合はList
参照型の配列は要素がオブジェクト参照であることも覚えておきましょう。
基本的な宣言と初期化(説明)
C#での配列宣言はシンプルです。型名の後に[]を付けます。
宣言と初期化は分けて書くことも、同時に書くこともできます。
例:宣言と初期化のパターン
// 要素数を指定して初期化
int[] numbers = new int[5];
// 要素を指定して初期化(コンパイラが型を推論)
int[] primes = new int[] { 2, 3, 5, 7 };
// varを使った初期化(右辺から型が決まる)
var names = new string[] { "Alice", "Bob", "Carol" };
// 要素リストの短縮記法(宣言時のみ)
string[] fruits = { "apple", "banana", "cherry" };
上の例では、numbersは0で初期化された5要素の配列になります。
primesやfruitsは指定した値で初期化されます。
要素のアクセスと注意点(説明)
配列の要素へはインデックスでアクセスします。最初の要素はindex=0です。
配列の長さにはLengthプロパティを使います。インデックス外の要素を指定すると、IndexOutOfRangeエラーになるので注意しましょう。

コード例:アクセスと更新
int[] a = { 10, 20, 30 };
// 読み取り
int x = a[1]; // 20
// 更新
a[2] = 99; // aは {10,20,99}
// 長さの取得
int len = a.Length; // 3
// 範囲外アクセス(例)
// int y = a[3]; // IndexOutOfRangeException
範囲外アクセスは実行時例外になります。必ず範囲チェックを行いましょう。
forループやforeachでの反復処理が一般的です。
ループ処理の使い分け(説明)
forはインデックスを使って自由に操作できます。変更やインデックス参照が必要なときに便利です。
foreachは読み取りに特化していて、書き換えが不要な場合に簡潔に書けます。
例:forとforeachの比較
int[] nums = { 1, 2, 3, 4 };
// forループ(要素の更新などに向く)
for (int i = 0; i < nums.Length; i++)
{
nums[i] *= 2;
}
// foreach(読み取り専用のように振る舞う)
foreach (var n in nums)
{
Console.WriteLine(n);
}
foreachで要素自体を直接書き換えようとするとエラーになります。
その場合はforを使いましょう。
配列の便利メソッド(説明)
System.Arrayには多くの便利メソッドがあります。SortやIndexOfなどが代表です。
またLINQを使うとさらに柔軟な操作が可能になります。
例:SortやIndexOf、Copy
int[] vals = { 5, 1, 4, 3 };
Array.Sort(vals); // {1,3,4,5}
int idx = Array.IndexOf(vals, 4); // 2
int[] dest = new int[4];
Array.Copy(vals, dest, vals.Length);
Array.Resizeを使うと配列のサイズを変更できますが、内部では新しい配列作成が行われます。
可変長の集まりにはList
多次元配列とジャグ配列(説明)
C#には多次元配列([,])とジャグ配列(配列の配列)の2種類があります。
用途に応じてメモリ配置やアクセス方法が異なるため使い分けが重要です。
例:宣言とアクセス
// 2次元配列(矩形)
int[,] grid = new int[3,4];
grid[1,2] = 7;
// ジャグ配列(各行の長さが異なる可能性がある)
int[][] jagged = new int[3][];
jagged[0] = new int[] {1,2};
jagged[1] = new int[] {3,4,5};
int value = jagged[1][2]; // 5
多次元配列は単一の連続領域に配置されることが多く、
ジャグ配列は各要素が独立した配列オブジェクトになります。
参照型要素の扱い(説明)
配列に格納する要素が参照型の場合、配列は参照を保持します。
同じオブジェクト参照を複数の配列要素に入れると、どちらかを変更すると影響が出ます。
例:参照共有による副作用
class Person { public string Name; }
Person p = new Person { Name = "Taro" };
Person[] arr = new Person[2] { p, p };
arr[0].Name = "Jiro";
Console.WriteLine(arr[1].Name); // "Jiro" と表示される
必要なら各要素を新しいインスタンスで初期化するか、ディープコピーを検討します。
よくあるエラーと対処法(理由と解決)
IndexOutOfRangeExceptionは配列のインデックスが許容範囲外のときに発生します。
対処法はLengthをチェックするか安全なループ条件を書くことです。
NullReferenceExceptionに注意
配列自体や配列要素がnullだとNullReferenceExceptionになります。
配列を使う前にnullチェックや初期化を行いましょう。
要素の初期値について
数値型は0、boolはfalse、参照型はnullで初期化されます。
意図した初期値を設定したい場合は明示的に各要素を初期化します。
パフォーマンス上の注意点(理由)
配列は連続領域に配置されるためキャッシュ効率が良く高速です。
ただし大きな配列を頻繁に生成・破棄するとガベージコレクションコストが増えます。
対応策
再利用可能なバッファを確保したり、必要に応じてListやSpan<T>を検討します。
Span<T>はスタック側での効率的なスライス操作を可能にします(C# 7.2以降)。
配列を使った実践的な例(例)
ここでは簡単な実用例を示します。配列で平均値を計算するケースです。
double[] scores = { 80.0, 90.5, 70.0, 85.0 };
double sum = 0;
for (int i = 0; i < scores.Length; i++)
{
sum += scores[i];
}
double avg = sum / scores.Length;
Console.WriteLine($"平均: {avg}");
配列の走査はこのようにシンプルで直感的です。
条件に応じてLINQのAverageメソッドを使うとさらに簡潔になります。
よくある質問(FAQ)
配列とListの違いは何ですか?
配列は固定長で連続メモリを使います。Listは可変長で内部で配列をラップしています。
要素数が変動する場合はListが扱いやすいです。パフォーマンス重視で固定長なら配列が有利です。
配列を動的に拡張できますか?
Array.Resizeで可能ですが内部で新しい配列が作られます。
頻繁に拡張するならList<T>を使う方が効率的です。
練習問題(実践)
以下の練習を試して理解を深めましょう。手を動かすことが最短の学習法です。
- 整数配列を受け取り、最大値と最小値を返すメソッドを実装する
- 2次元配列を使って簡単なマップ(3×3)を表現し、周囲の数を集計する
- 参照型の配列でディープコピーを実装し、元の配列を変更してもコピーが影響を受けないようにする
解答は自分で実装した後、ArrayやLINQのメソッドを使って最適化してみてください。
まとめ(再確認)
C#の配列は基本を押さえれば扱いやすく、パフォーマンス面でも強力です。
宣言・初期化、インデックス管理、ループ処理、参照型の注意点を覚えましょう。
さらにArrayのメソッドやLINQ、ListやSpanといった代替手段も状況に応じて使い分けてください。
この記事のサンプルをコピペして動かし、実際に挙動を確認することをおすすめします。

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

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