連載

C#入門

第14 C#の配列機能

(株)ピーデー
川俣 晶
2001/10/24


参照型の配列

 ここまでのサンプルソースは、整数型を使って記述してきたが、他の値型のデータ型でも同様に扱うことができる。しかし、参照型に関しては、同じとはいかない。以下に、この具体例を示す。

 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から確定可能である。曖昧さはない。


 INDEX
  第14回 C#の配列機能
    1.C#の一次元配列
  2.参照型の配列
    3.参照型配列の初期化
    4.配列をソートする
    5.配列のバイナリ・サーチ
    6.文字配列と文字列の相互変換
 
「C#入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間