Unity & C# 学習教材

Array クラスと配列の性質(補足)

配列は単純なデータの並びに見えますが、C# では System.Array クラスを継承するオブジェクトです。このページでは配列変数のコピーの挙動と、配列を操作する組み込みメソッドを学びます。

学習目標

前提知識


1. System.Array — 配列の正体

C# のすべての配列は System.Array クラスを継承しています。int[] を宣言するとき、実は System.Array のサブクラスのインスタンスが生成されています。

1
2
3
int[] scores = { 85, 72, 90, 68, 95 };
Console.WriteLine(scores.GetType());  // System.Int32[]
Console.WriteLine(scores is Array);   // True

2. 変数には配列への参照が入る

int[] scores のような変数に格納されるのは配列本体ではなく、配列がどこにあるかを示す参照です。

scores 85 72 90 68 95 [0] [1] [2] [3] [4]

new を書くたびに新しい配列が生成されます。変数にはその配列への参照(どこにあるかという情報)が入ります。

1
2
3
int[] a = { 1, 2, 3 };           // new int[] { 1, 2, 3 } と同じ
int[] b = new int[] { 1, 2, 3 }; // new → 別の配列が作られる
// a と b は独立した別の配列

代入は参照のコピー(同じ配列を指す)

b = a と書くと参照がコピーされます。new が書かれていないので新しい配列は作られず、ab同じ配列を指すことになります。

a b 1 2 3 同じ配列を指している
1
2
3
4
5
int[] a = { 1, 2, 3 };
int[] b = a;          // 参照のコピー(new がない → 同じ配列)

b[0] = 99;
Console.WriteLine(a[0]);  // 99(a も変わっている!)

Array.Copy を使うと新しい配列に要素をコピーして独立させることができます。


3. 配列のプロパティ

Length / Rank / GetLength

Length — 全要素数(すべての次元を含む)。

Rank — 配列の次元数。1 次元配列は 1、2 次元は 2

GetLength(n) — 指定した次元の要素数を返します。

書式:GetLength メソッド

1
int GetLength(int dimension);
パラメータ 説明
dimension int 取得する次元のインデックス(0 始まり)
1
2
3
4
int[] arr = { 10, 20, 30, 40 };
Console.WriteLine(arr.Length);       // 4
Console.WriteLine(arr.Rank);         // 1
Console.WriteLine(arr.GetLength(0)); // 4(0 次元目の要素数)

4. Array クラスの静的メソッド

Array.Sort — 昇順に並び替え

Array.Sort — 配列を昇順にソートします(元の配列を直接変更します)。

書式:Array.Sort メソッド

1
static void Array.Sort(Array array);
1
2
3
4
5
int[] nums = { 40, 10, 30, 20 };
Array.Sort(nums);

foreach (int n in nums)
    Console.Write(n + " ");  // 10 20 30 40

Array.Reverse — 逆順に並び替え

Array.Reverse — 配列の要素順を逆にします(元の配列を直接変更します)。

書式:Array.Reverse メソッド

1
static void Array.Reverse(Array array);
1
2
3
4
5
int[] nums = { 10, 20, 30, 40 };
Array.Reverse(nums);

foreach (int n in nums)
    Console.Write(n + " ");  // 40 30 20 10

Array.IndexOf — 要素を検索

Array.IndexOf — 指定した値が最初に見つかったインデックスを返します。見つからない場合は -1

書式:Array.IndexOf メソッド

1
static int Array.IndexOf(Array array, object? value);
パラメータ 説明
array Array 検索する配列
value object? 検索する値
1
2
3
string[] fruits = { "apple", "banana", "cherry" };
Console.WriteLine(Array.IndexOf(fruits, "banana"));  // 1
Console.WriteLine(Array.IndexOf(fruits, "grape"));   // -1(見つからない)

Array.Copy — 独立したコピーを作る

Array.Copy — 配列の要素を別の配列にコピーします。b = a の代入とは異なり、Array.Copy はコピー先として new で新たに作った配列を使うため、2 つの配列が独立した状態になります。

変数の代入(b = a) a b 1 2 3 同じ配列 / b[0]=99 で a[0] も変わる Array.Copy(独立したコピー) original copy 1 2 3 99 2 3 ↑ copy[0]=99 にしても original は変わらない

書式:Array.Copy メソッド

1
static void Array.Copy(Array sourceArray, Array destinationArray, int length);
パラメータ 説明
sourceArray Array コピー元の配列
destinationArray Array コピー先の配列
length int コピーする要素数
1
2
3
4
5
6
7
int[] original = { 1, 2, 3 };
int[] copy = new int[3];
Array.Copy(original, copy, original.Length);

copy[0] = 99;
Console.WriteLine(original[0]);  // 1(元の配列は変わらない)
Console.WriteLine(copy[0]);      // 99

Array.Clear — 要素を初期値にリセット

Array.Clear — 指定した範囲の要素を型の初期値(数値は 0、参照型は null)にリセットします。

書式:Array.Clear メソッド

1
static void Array.Clear(Array array, int index, int length);
パラメータ 説明
array Array 対象の配列
index int リセット開始インデックス
length int リセットする要素数
1
2
3
4
5
int[] nums = { 10, 20, 30, 40, 50 };
Array.Clear(nums, 1, 3);  // インデックス 1 〜 3 を 0 に

foreach (int n in nums)
    Console.Write(n + " ");  // 10 0 0 0 50

よくあるミス

1
2
3
4
5
6
7
8
9
10
int[] a = { 1, 2, 3 };

// ❌ NG: 代入は参照のコピー(中身はコピーされない)
int[] b = a;
b[0] = 99;  // a[0] も 99 になる

// ✅ OK: Array.Copy で独立したコピーを作る
int[] c = new int[a.Length];
Array.Copy(a, c, a.Length);
c[0] = 99;  // a[0] は変わらない

まとめ


理解度チェック

  1. int[] a = {1,2,3}; int[] b = a; b[1] = 99; を実行後、a[1] の値は何ですか?
  2. Array.SortArray.Reverse を組み合わせて配列を降順に並べるコードを書いてください。
  3. 次のコードで nums の最終的な内容は何ですか?

    1
    2
    
    int[] nums = { 5, 10, 15, 20, 25 };
    Array.Clear(nums, 2, 2);
    
解答を見る
  1. 99 です。b = a は参照のコピーのため(new が書かれていない)、ba は同じ配列を指しています。

  2. 1
    2
    3
    
    int[] nums = { 3, 1, 4, 1, 5 };
    Array.Sort(nums);    // 昇順: 1 1 3 4 5
    Array.Reverse(nums); // 逆順: 5 4 3 1 1
    
  3. { 5, 10, 0, 0, 25 } です。インデックス 2 と 3 が 0 にリセットされます。

次のステップ

多次元配列 では、行と列を持つ 2 次元配列を学びます。