配列(array)は、同じ型の値を連続して格納するデータ構造です。複数の値を 1 つの変数でまとめて管理できます。
Length を使って要素数を取得できるfor と foreach で配列を走査できるIndexOutOfRangeException)を避けられる配列はメモリ上に連続して並んだ格納場所の集まりです。各格納場所には 0 から始まるインデックス(番号)でアクセスします。
5 つの整数を格納する int[] scores を例に説明します。先頭は scores[0]、末尾は scores[4] でアクセスします。
配列を使うには、まず配列を参照するための変数を宣言します。
書式:配列変数の宣言
1
型[] 変数名;
| 要素 | 説明 |
|---|---|
型[] |
配列の型。[] が「配列であること」を示す |
変数名 |
配列を参照するための変数 |
1
int[] scores; // int 型配列を参照する変数を宣言
この時点では変数 scores が存在するだけで、配列の実体(要素を格納するメモリ領域)はまだ生成されていません。
配列の実体を生成するには new 式を使います。
書式:配列インスタンスの生成
1
new 型[要素数]
| 要素 | 説明 |
|---|---|
型 |
要素の型 |
要素数 |
格納できる要素の個数(生成後に変更不可) |
生成した配列を変数に代入することで、変数から配列にアクセスできるようになります。
1
2
int[] scores; // 変数を宣言
scores = new int[5]; // 5 要素の配列を生成して代入
宣言と代入は 1 行にまとめるのが一般的です。
1
int[] scores = new int[5]; // 宣言と同時に配列を生成
生成直後の要素は型ごとの既定値で自動初期化されます。数値型は 0、bool は false、参照型は null です。
書式:要素アクセス
1
配列[インデックス]
| 要素 | 説明 |
|---|---|
インデックス |
0 以上 Length - 1 以下の整数 |
配列を生成した後、インデックスを使って各要素に個別に値を代入できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
int[] scores = new int[5]; // 全要素が 0 で初期化
scores[0] = 85; // 先頭要素に代入
scores[1] = 72;
scores[2] = 90;
scores[3] = 68;
scores[4] = 95; // 末尾要素に代入
Console.WriteLine(scores[0]); // 85(先頭)
Console.WriteLine(scores[4]); // 95(末尾)
scores[2] = 100; // 値の書き換え
Console.WriteLine(scores[2]); // 100
書式:末尾インデックス
1
配列[^n]
^1 は末尾の要素、^2 は末尾から 2 番目を指します。
1
2
3
4
5
6
7
8
9
int[] scores = new int[5];
scores[0] = 85;
scores[1] = 72;
scores[2] = 90;
scores[3] = 68;
scores[4] = 95;
Console.WriteLine(scores[^1]); // 95(末尾)
Console.WriteLine(scores[^2]); // 68(末尾から 2 番目)
💡
scores[^1]はscores[scores.Length - 1]と同じ意味です。
個別に代入する代わりに、配列初期化子(array initializer)を使うと宣言と同時に値を設定できます。
書式:配列初期化子
1
型[] 変数名 = { 値1, 値2, ... };
1
2
3
4
5
6
7
8
9
10
11
int[] scores = { 85, 72, 90, 68, 95 };
// new を明示する書き方も同じ意味
int[] scores2 = new int[] { 85, 72, 90, 68, 95 };
// var を使う場合は new が必要
var scores3 = new int[] { 85, 72, 90, 68, 95 }; // var は int[] と推論される
var scores4 = new[] { 85, 72, 90, 68, 95 }; // 要素の型から自動推論(型名を省略)
// ❌ NG: var と { } の組み合わせ — 左も右も型を決められず推論不可
var scores5 = { 85, 72, 90, 68, 95 }; // コンパイルエラー
| 左辺 | 右辺 | 結果 |
|---|---|---|
int[] |
{ ... } |
✅ 左辺が型を決める |
var |
new int[] { ... } |
✅ 右辺が型を決める |
var |
new[] { ... } |
✅ 要素の型から右辺が決める |
var |
{ ... } |
❌ 左も右も型を持たず推論不可 |
int[] を左辺に書けば new int[] を省略できます。var を使う場合は new が必要です(var scores = { ... } とは書けません)。
全要素をループで処理するとき、終了条件に要素数を直接書くことができます。
1
2
3
4
5
6
int[] scores = { 85, 72, 90, 68, 95 };
for (int i = 0; i < 5; i++) // 終了条件に定数 5 を使用
{
Console.WriteLine($"scores[{i}] = {scores[i]}");
}
しかしこの書き方では、配列の要素数が変わったときにループの終了条件も手で直す必要があります。要素を 1 つ追加して 6 要素に変えても i < 5 はそのままなので、末尾の要素が読み取れません。
Length プロパティを使うと、配列が持つ要素数を常に正確に取得できます。
書式:Length プロパティ
1
int Length { get; }
これで配列の要素数を得られるのでループの終了条件に使うと、要素数と自動的に連動します。
1
2
3
4
5
6
int[] scores = { 85, 72, 90, 68, 95 };
for (int i = 0; i < scores.Length; i++) // 要素数と自動的に連動する
{
Console.WriteLine($"scores[{i}] = {scores[i]}");
}
要素数が変わっても scores.Length が常に正しい値を返すため、ループ条件を修正する必要がありません。インデックスが必要な場合(要素の書き換えや位置の利用)は for を使います。
1
2
3
4
5
6
int[] scores = { 85, 72, 90, 68, 95 };
foreach (int score in scores)
{
Console.WriteLine(score);
}
インデックスが不要で要素を順に読むだけなら foreach が簡潔です。var 型推論・読み取り専用の制約・break/continue との組み合わせ・for との使い分けは配列と foreach(補足)で詳しく解説します。
1
2
3
4
5
6
7
8
int[] scores = { 85, 72, 90, 68, 95 };
// ❌ NG: インデックスが Length と等しい(範囲外)
Console.WriteLine(scores[5]); // System.IndexOutOfRangeException
// ✅ OK: 最後の要素は Length - 1 または ^1
Console.WriteLine(scores[scores.Length - 1]); // 95
Console.WriteLine(scores[^1]); // 95
配列のインデックスは 0 〜 Length - 1 の範囲です。Length そのものはインデックスとして使えません。
C# 12 から [...] を使ったコレクション式で配列を初期化できます。
1
2
// C# 12 以降
int[] scores = [85, 72, 90, 68, 95];
{ } 構文と同じ意味ですが、List<T> などでも同じ記法が使える統一構文です。
型[] 変数名 で変数を宣言し、new 型[要素数] で配列インスタンスを生成する{ 値, ... } を使うと宣言と同時に値を設定できる0 始まり。末尾は [^1](C# 8 以降)Length で要素数を取得するforeach、書き換えや位置が必要なら forIndexOutOfRangeException を引き起こすstring 配列を "red", "green", "blue" で初期化するコードを書いてください。次のコードを実行すると何が出力されますか?
1
2
int[] nums = new int[3];
Console.WriteLine(nums[1]);
for ループを使って配列のすべての要素の合計を計算するコードを書いてください。1
string[] colors = { "red", "green", "blue" };
0 が出力されます。数値型配列の要素は 0 で自動初期化されるためです。
1
2
3
4
5
6
7
int[] nums = { 1, 2, 3, 4, 5 };
int sum = 0;
for (int i = 0; i < nums.Length; i++)
{
sum += nums[i];
}
Console.WriteLine(sum); // 15
配列と foreach(補足) では、foreach の書式詳細・var 推論・break/continue との組み合わせ・for との使い分けを学びます。