[an error occurred while processing this directive] [an error occurred while processing this directive] .NET TIPS:C#で配列を宣言するには? - @IT
[an error occurred while processing this directive]
【@記事種別@】
[an error occurred while processing this directive]
C#で配列を宣言するには?

.NET TIPS

C#で配列を宣言するには?

遠藤 孝信
2005/02/11
デジタルアドバンテージ

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

配列の作成と要素の代入

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

C#
string[] array = new string[3];

 この時点では変数arrayは大きさが3の配列を参照しているが、配列の各要素はオブジェクトを参照していない(null参照)。

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

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

配列の初期化

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

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

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

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

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

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

 ちなみに、配列作成時の要素数の指定には次のようにして変数でも指定可能である。

C#
int num = 3;
string[] array;
array = new string[num];

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

 配列を扱ううえで1つ注意が必要な点は、配列変数がnullを参照している場合、

C#
array = null;

と、サイズが0の配列を参照している場合、

C#
array = new string[0];

の違いである。

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

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

C#
string[] GetNames() {
  ArrayList list = new ArrayList();
  // ……
  // list.Add(……);によりいくつかの要素を追加
  // ……
  return (string [])list.ToArray(typeof(string));
}

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

 このようにしておけば、このメソッドを呼び出す側ではその要素数が0かどうかにかかわらず、

C#
string[] names = GetNames();
for (int i = 0; i < names.Length; i++) {
  // names[i]を使った処理
}

や、

C#
foreach (string s in GetNames()) {
  // 文字列sを使った処理
}

といった記述が可能になり、メソッドの戻り値に対してnullチェックを行う必要もない。

カテゴリ:C# 処理対象:データ型
使用ライブラリ:Arrayクラス(System名前空間)
使用ライブラリ:ArrayListクラス(System.Collections名前空間)
[an error occurred while processing this directive]
[an error occurred while processing this directive]
[an error occurred while processing this directive]
[an error occurred while processing this directive]