本稿は2005/02/11に初版公開された記事を改訂したものです。
本稿では、C#で配列(1次元配列)を使用する場合に必要となる初期化の方法や注意点についてまとめる。
配列の作成と要素の代入
まず次の行では、文字列の配列のための変数を宣言し、3つの文字列を格納できる(=大きさが3)の配列を作成している。
string[] array = new string[3];
この時点では変数arrayは大きさが3の配列を参照しているが、配列の各要素はオブジェクトを参照していない(null参照)。これは参照型の値を要素とする配列では、各要素がnull参照に初期化されるからだ。一方、値型の値を要素とする配列では、配列の作成時には各要素は「0」(または0に相当する値。int型であれば0、bool型であればFalseなど)に初期化される。
配列の各要素には次のようにしてオブジェクト(への参照)を代入できる。ここでは文字列の配列を作成しているので、各要素には文字列が代入できる。
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 = {"いち", "に", "さん"};
ちなみに、配列作成時の要素数は、次のようにして変数を使用しても指定できる。
int num = 3;
string[] array;
array = new string[num]; // 変数で要素数を指定
null参照の配列と要素数0の配列
配列を扱う上で1つ注意が必要な点は、配列変数がnullを参照している場合とサイズが0の配列を参照している場合の違いだ。
// nullを参照している配列変数
array = null;
// サイズ0の配列を参照している配列変数
array = new string[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を使った処理
}
カテゴリ:C# 処理対象:データ型
使用ライブラリ:Arrayクラス(System名前空間)
使用ライブラリ:List<T>クラス(System.Collections.Generic名前空間)
更新履歴
【2017/11/16】varキーワードによる配列宣言の方法を追加するとともに、図版の追加、リストや図へのキャプションの追加など、全般的な構成の変更を行いました。
【2005/02/11】初版公開。
■この記事と関連性の高い別の.NET TIPS
Copyright© Digital Advantage Corp. All Rights Reserved.