連載
» 2017年11月16日 05時00分 公開

.NET TIPS:C#で配列を宣言するには?

本稿では、C#で配列(1次元配列)を使用する場合に必要となる初期化の方法や注意点についてまとめる。

[遠藤孝信, かわさきしんじ,共著]
「.NET TIPS」のインデックス

連載「.NET TIPS」

本稿は2005/02/11に初版公開された記事を改訂したものです。


 本稿では、C#で配列(1次元配列)を使用する場合に必要となる初期化の方法や注意点についてまとめる。

POINT 配列の宣言

配列の宣言の構文まとめ 配列の宣言の構文まとめ


配列の作成と要素の代入

 まず次の行では、文字列の配列のための変数を宣言し、3つの文字列を格納できる(=大きさが3)の配列を作成している。

string[] array = new string[3];

文字列配列の宣言の例

 この時点では変数arrayは大きさが3の配列を参照しているが、配列の各要素はオブジェクトを参照していない(null参照)。これは参照型の値を要素とする配列では、各要素がnull参照に初期化されるからだ。一方、値型の値を要素とする配列では、配列の作成時には各要素は「0」(または0に相当する値。int型であれば0、bool型であればFalseなど)に初期化される。

文字列配列など参照型の値を要素とする配列では、配列の作成時に各要素はnull参照で初期化される 文字列配列など参照型の値を要素とする配列では、配列の作成時に各要素はnull参照で初期化される

 配列の各要素には次のようにしてオブジェクト(への参照)を代入できる。ここでは文字列の配列を作成しているので、各要素には文字列が代入できる。

array[0] = "いち";
array[1] = "に";
array[2] = "さん";

文字列配列の各要素には文字列(への参照)を代入できる

文字列配列の各要素には文字列(への参照)を代入できる 文字列配列の各要素には文字列(への参照)を代入できる

配列の初期化

 上記の例では配列の作成と要素への代入を別々に行ったが、中かっこ({…})で配列の初期値を記述することにより、次のように1つにまとめて記述できる。

string[] array;
array = new string[3] {"いち", "に", "さん"};

配列の作成と初期化をまとめて行う例

 このような場合には、配列の要素数の指定は次のようにして省略できる。配列の大きさは、自動的に指定した初期値の要素の数となる。

string[] array;
array = new string[] {"いち", "に", "さん"};

配列作成時に初期化も同時に行うのであれば要素数の指定は省略できる

 さらに、配列の宣言と配列の初期値を同時に行う場合には、配列作成のための記述(new string[]の部分)も省略可能だ。

string[] array = {"いち", "に", "さん"};

配列の宣言、作成、初期化を一度に行う例

 C# 3.0以降では、varキーワードを使用して変数の型を明示することなく配列を宣言したり、宣言と初期化を同時に行ったりできる。このような配列のことを「暗黙的に型指定される配列」と呼ぶ。

// 暗黙的に型指定された配列の宣言
var array = new string[3];

// 暗黙的に型指定された配列の宣言と初期化
var array = new string[] {"いち", "に", "さん"};

暗黙的に型指定される配列の作成

 ただし、varキーワードを使用して暗黙的に型指定される配列を作成する場合には「new 型名[]」は省略できないので注意しよう。つまり、以下のようなコードはエラーとなる。

// エラーとなるコードの例
var array = {"いち", "に", "さん"};

暗黙的に型指定される配列の作成では「new 型名[]」を省略できない

 ちなみに、配列作成時の要素数は、次のようにして変数を使用しても指定できる。

int num = 3;
string[] array;
array = new string[num]; // 変数で要素数を指定

変数で要素数を指定する例

null参照の配列と要素数0の配列

 配列を扱う上で1つ注意が必要な点は、配列変数がnullを参照している場合とサイズが0の配列を参照している場合の違いだ。

// nullを参照している配列変数
array = null;

// サイズ0の配列を参照している配列変数
array = new string[0];

この2つのコードが意味するものは異なる

 当然ながら両者は同じではない。上に示したコードを図にすると次のようになる。

配列変数がnullを参照する場合と、要素数0の配列を参照する場合 配列変数がnullを参照する場合と、要素数0の配列を参照する場合

 サイズが0の配列をわざわざ作成するようなことはほとんどないが、結果的にそのような配列が必要となるケースはあり得る。これは例えば、処理結果を配列として返すようなメソッドの場合である。このようなメソッドでは、最終的に得られる要素の数が不定であるため、内部的にList<T>クラス(System.Collections.Generic名前空間)などを利用してオブジェクトのリストを作成し、それを配列に変換して返すという方法がよく用いられる。

 次のコードは、List<string>オブジェクトに得られた要素を配列として返すメソッドの記述例である。

string[] GetNames() {
  var list = new List<string>();
  // ……
  // list.Add(……);などにより幾つかの要素を追加
  // ……
  // あるいは
  // var list = new List<string>() { "……", "……", };
  // のように「コレクション初期化子」も使える
  return list.ToArray();
}

内部でコレクションを利用して、最終的に配列を返すメソッドの例

 List<T>クラスのToArrayメソッドは、コレクション内の要素を型パラメーターで指定された型の配列に変換する。このメソッド内で得られる要素が0だった場合にはメソッドの戻り値としてnullを返すこともできるが、そのような場合にもToArrayメソッドにより要素数が0の配列を作成し返す方が望ましい。

 このようにしておけば、このメソッドを呼び出す側ではその要素数が0かどうかにかかわらず、以下のような記述が可能になり、メソッドの戻り値に対してnullチェックを行う必要がなくなるからだ。

// forループで配列の要素を走査する
string[] names = GetNames();
for (int i = 0; i < names.Length; i++) {
  // names[i]を使った処理
}

// foreachループで配列の要素を走査する
foreach (string s in GetNames()) {
  // 文字列sを使った処理
}

nullではなく配列を返すことで、nullチェックを行う必要がなくなる

カテゴリ:C# 処理対象:データ型
使用ライブラリ:Arrayクラス(System名前空間)
使用ライブラリ:List<T>クラス(System.Collections.Generic名前空間)


更新履歴

【2017/11/16】varキーワードによる配列宣言の方法を追加するとともに、図版の追加、リストや図へのキャプションの追加など、全般的な構成の変更を行いました。

【2005/02/11】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。