参照型の配列
ここまでのサンプルソースは、整数型を使って記述してきたが、他の値型のデータ型でも同様に扱うことができる。しかし、参照型に関しては、同じとはいかない。以下に、この具体例を示す。
1: using System;
2:
3: namespace ConsoleApplication73
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: string [] ar = new string[10];
10: for( int i=0; i<10; i++ )
11: {
12: //Console.WriteLine( ar[i].Length ); // 実行時にnullを参照したというエラーになる
13: }
14: for( int i=0; i<10; i++ )
15: {
16: ar[i] = (i*2).ToString();
17: }
18: for( int i=0; i<10; i++ )
19: {
20: Console.WriteLine( ar[i].Length );
21: }
22: }
23: }
24: } |
|
文字列の配列を使用したサンプル・プログラム4 |
整数型などの参照型の配列とは異なり、配列のインスタンスを作成しただけでは、配列の要素にアクセスできない。 |
これを実行すると以下のようになる。
|
サンプル・プログラム4の実行結果 |
i番目の要素には、i * 2の値を文字列に変換したものが入っており、各要素の文字列の長さが表示される。
|
ここで注目すべきは12行目である。配列を宣言した直後、配列に値を入れる前に、それを参照しようとすると、nullを参照したというエラーになってしまう。これは、参照型の配列インスタンスをnewで作成しても、中身はnullのままでインスタンスは作成されていないことから起こる現象である。つまり、参照型を配列変数で使うには、配列のインスタンスを作るだけでは十分ではなく、それに加えて、個々の要素のインスタンスも作成しなければならないということである。要素の数が10個なら、配列自身と要素を合わせて、計11回のnewを行う必要がある。なお、このサンプルソースでは、16行目のToStringメソッドの中で文字列がnewされている。
なお、念のために16行目で何が起きているかを詳しく説明しておこう。ar[i]というのは、もちろん、i番目の配列arを示している。イコールの後半の値が、ここに格納される。さて、イコールの後ろはというと、まず、i*2という式が計算されている。もちろん、iも2も整数なので、2倍しているということだ。そして、その計算結果に、いきなりToStringメソッドがくっついている。整数型の数値は、int(正式にはSystem.Int32)というstructの値である。このstructはメソッドを持っている。そのメソッドの中の1つがToStringである。このメソッドの機能は文字列に変換することなので、数値は文字列に変換される。その結果、文字列型の配列に、素直に入れることが可能になるのである。
初期化と省略構文
配列を宣言する際に、決まりきった値を、あらかじめ決め打ちで入れてしまいたい場合がある。これを実現するために、C#では、配列の作成時に初期値を指定することができる。また、宣言の構文には省略構文が存在する。以下のサンプルソースで、それを説明する。
1: using System;
2:
3: namespace ConsoleApplication74
4: {
5: class Class1
6: {
7: static void Main(string[] args)
8: {
9: int [] ar1 = new int [4] { 0, 1, 2, 3 };
10: int [] ar2 = new int [] { 0, 1, 2, 3 };
11: int [] ar3 = { 0, 1, 2, 3 };
12: for( int i=0; i<4; i++ )
13: {
14: Console.WriteLine( "{0},{1},{2}", ar1[i], ar2[i], ar3[i] );
15: }
16: }
17: }
18: } |
|
配列の作成時に初期化を行っているサンプル・プログラム5 |
初期化を伴った配列の宣言では、要素数などを省略することができる。 |
これを実行すると以下のようになる。
|
サンプル・プログラム5の実行結果 |
初期化を行った3つの配列の各要素が表示される。
|
まず、基本的な構文は9行目で示すようなものである。int [] ar1 = new int [4]の部分はすでに解説したとおりの意味を持つ。問題は、それに続く { 0, 1, 2, 3 }である。中カッコで囲み、カンマで区切った式のリストを記述する。これを初期化リストという。これにより、配列変数が作成されるときに、その式の値が個々の要素の中に格納される。つまり、9行目のコードが実行された時点ですでに変数ar1の0番目の要素には0が、1番目の要素には1が、……というように値が格納済みになるのである。
さて、初期化リストが指定されている場合、10行目のように、newに対応する要素数を記述しないという方法もとれる。省略できるのは、初期化リストの中の項目数を数えれば、何個の要素を持つ配列になるべきかが明らかに分かるためだ。
さらに突き詰めていくと、11行目のように、newもデータ型も角括弧も書かず、ただ初期化リストだけをイコール記号の右側に置くという書式も可能である。この場合は初期化リストの項目数から要素の数が確定し、データ型は行頭のintから確定可能である。曖昧さはない。
Insider.NET 記事ランキング
本日
月間