配列(array)は、同じ型の値を連続して格納するデータ構造です。複数の値を 1 つの変数でまとめて管理できます。
Length を使って要素数を取得できるfor と foreach で配列を走査できるIndexOutOfRangeException)を避けられる配列はメモリ上に連続して並んだ格納場所の集まりです。各格納場所には 0 から始まるインデックス(番号)でアクセスします。
5 つの整数を格納する int[] scores を例に説明します。先頭は scores[0]、末尾は scores[4] でアクセスします。
書式:配列の宣言(要素数指定)
1
型[] 変数名 = new 型[要素数];
| 要素 | 説明 |
|---|---|
型[] |
配列の型。[] が「配列であること」を示す |
new 型[要素数] |
指定した要素数の配列を新しく生成する |
1
int[] scores = new int[5]; // 5 要素の int 配列(すべて 0 で初期化)
数値型は 0、bool は false、参照型は null で自動初期化されます。
書式:配列の宣言(初期化子)
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 |
{ ... } |
❌ 左も右も型を持たず推論不可 |
宣言と同時に値を指定する場合は new 型[] を省略できます。var を使う場合は new が必要です(var scores = { ... } とは書けません)。
書式:要素アクセス
1
配列[インデックス]
| 要素 | 説明 |
|---|---|
インデックス |
0 以上 Length - 1 以下の整数 |
1
2
3
4
5
6
7
int[] scores = { 85, 72, 90, 68, 95 };
Console.WriteLine(scores[0]); // 85(先頭)
Console.WriteLine(scores[4]); // 95(末尾)
scores[2] = 100; // 値の書き換え
Console.WriteLine(scores[2]); // 100
Length — 配列の要素数を返します。
書式:Length プロパティ
1
int Length { get; }
1
2
int[] scores = { 85, 72, 90, 68, 95 };
Console.WriteLine(scores.Length); // 5
書式:末尾インデックス
1
配列[^n]
^1 は末尾の要素、^2 は末尾から 2 番目を指します。
1
2
3
4
int[] scores = { 85, 72, 90, 68, 95 };
Console.WriteLine(scores[^1]); // 95(末尾)
Console.WriteLine(scores[^2]); // 68(末尾から 2 番目)
💡
scores[^1]はscores[scores.Length - 1]と同じ意味です。
1
2
3
4
5
6
7
8
9
10
11
int[] scores = { 85, 72, 90, 68, 95 };
for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine($"scores[{i}] = {scores[i]}");
}
// scores[0] = 85
// scores[1] = 72
// scores[2] = 90
// scores[3] = 68
// scores[4] = 95
インデックスが必要な場合(要素の書き換えや位置の利用)は for を使います。
1
2
3
4
5
6
7
8
9
10
11
int[] scores = { 85, 72, 90, 68, 95 };
foreach (int score in scores)
{
Console.WriteLine(score);
}
// 85
// 72
// 90
// 68
// 95
インデックスが不要で要素を順に読むだけなら 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 との使い分けを学びます。