3-3 配列

3-3-1 VB .NET の配列

一般的に配列とは、同じデータ型のデータ(要素)の連続的な集合のことで、それぞれのデータ(要素)を識別するために、「添え字」(インデックス)で区別します。もちろん、VB .NET でも配列を扱うことができます。以下のように配列名 D のあとに丸括弧( )をつけ、括弧の中に添え字を書きます。この値の代入のようすを示したのが、次の図 3-9 です。

[例] 添え字を使って要素を識別し、配列 D の各要素に値を代入

                  
1:  D(0) = 100  '先頭の要素に値を代入
2:  D(3) = 200  '4 番目の要素に値を代入

図 3-9 VB .NET の配列

図 3-9 VB .NET の配列

ただし、注意すべき点が 2 つあります。

1 つは、VB .NET の配列変数が常に参照型であるということです。そのため、配列データの操作や、その表記方法について若干の注意が必要です。この点については、改めて 3-3-3 「参照型としての配列変数」 で扱います。

もう1つは、添え字を複数もつ、いわゆる 「多次元」 の配列には、「多次元配列」 と 「多段階配列」 の 2 つがある点です。この点については、3-3-5 「多次元配列」、および 3-3-6 「多段階配列」で説明します。

[例] 多次元配列と多段階配列

                  
1:  Tbl(3,4)  = 100  //多次元配列
2:  Dat(3)(4) = 200  //多段階配列

3-3-2 配列の宣言と利用

配列を扱いたい場合、配列の変数宣言において丸括弧 ( ) をつけて添え字の上限値を指定します。例えば、配列の変数名を X として X(0) から X(10) まで利用したいのであれば、以下のようになります。

[例] 添え字上限値 10 の配列 X を確保

                  
Dim X(10) As Integer

As 句の後ろのデータ型は、配列の個々の要素のデータ型です。つまり、この配列 X は Integer 型の要素の集合です。

気を付ける点は、10 という数値は要素の数ではないということです。あくまで添え字の上限値を指定します。VB .NET の配列の添え字は、常に 0 から始まるので、利用可能な添え字は 0 から 10 までになり、要素数は 11 個になります。

これを一般形で書くと、以下のようになります。

Dim 配列名(添え字上限値) As 各要素のデータ型

このとき、要素は配列名 (0) から配列名 (10) までの、添え字上限値 +1 個の要素が確保されます。

ワンポイント

● for VB6

従来の VB6 では、Option Base ステートメントによって、配列の開始添え字を 0 からではなく 1 に変更できましたが、VB .NET では常に配列の添え字は 0 から始まります。VB .NET では、Option Base ステートメントをサポートしていません。

また、従来の VB6 でサポートしていた添え字の下限と上限を指定する以下の表記も、VB .NET ではサポートしません。

[例] VB6 における添え字の範囲指定(VB .NET はサポートしない)

                        
Dim X(5 To 10) As Integer

配列変数の宣言時に各要素に初期値を設定したい場合、以下のように括弧 { } をつけて、要素の数だけカンマ区切りで初期値を並べるリストを記述します。この場合は、初期値のリストに並べた要素の数だけ配列要素が確保されます。

注意する点は、丸括弧( )の中には添え字の上限を指定していない点です(添え字の上限を指定すると、コンパイルエラー BC30672 になります)。

[例] 各要素に明示的な初期化をおこなう

                  
1: Dim X() As Integer = { 100, 200, 300, 400, 500 }

この例では、5 個分の要素の初期化をおこなっているので、X(0) から X(4) までを利用することができます。つまり、実質的には 「Dim X(4) As Integer」 と宣言したのと同じです。

なお、これら配列は変数宣言の一種ですから、3-1-5 「Dim 文によるさまざまな変数の宣言」 で触れたさまざまな表現が可能です。以下の配列変数の宣言は、どれも正しい形式です。

[例] さまざまな配列宣言

                  
1: Dim A(10), B(20) As Integer
2: Dim C(10) As Integer, D(10) As Long, E(20) As String
3: Dim F() As Integer = {2, 4, 16}, G() As Byte = { 1, 3, 7, 15 }

3-3-3 参照型としての配列変数

前項では、基本的な事項を確認するために、あえて参照型の話には触れませんでした。ここでは改めて、配列変数が参照型であるという点を確認していきます。

すでに説明したように、値型の変数は、その変数自体がデータ型にみあう領域を意味していますが、参照型は、変数そのものはデータの実体ではありません。配列変数は、この参照型にあたります。以下の配列 D の例で考えてみます。

[例] 配列 D

                  
1: Dim D(10) As Integer
2: D(0) = 100
3: D(3) = 300

個々の要素である Dat(0) や Dat(3) は Integer 型のデータ領域で値型ですが、配列変数名 D は、配列の実体ではありません。これを図示すると、以下のようになります(図 3-10)。

図 3-10 配列変数 D は、配列のデータ実体を参照する

図 3-10 配列変数 D は、配列のデータ実体を参照する

配列の実体データである個々要素は、Integer 型(4 バイト長)のデータで、そのデータが 11 個連続しています(D(0) から D(10) まで)。しかし、配列変数 D 自体はメモリ上の小さな領域であり、配列の実体がメモリ上のどこにあるのかという位置情報(参照情報)をもっています。これを

「配列変数 D は、配列の実体データを参照している。」

と表現します。基本的な配列操作では、あまり参照型であることを意識する状況は少ないですが、さまざまな細かい配列操作をするうえで、この構造を意識する必要が出てきます。

例えば、VB .NET の配列変数では、以下の 3 行目のような表記ができます。

[例] 参照型の配列変数 D に Nothing を代入

                  
1: Dim D(10) As Integer
2:   (中略)
3: D = Nothing

この例では、VB .NET のキーワードである Nothing(何もないことを表すキーワード)を、配列変数 D に代入しています。これは、11 個の要素からなる配列 D の個々の要素を 0 で初期化する意味ではありません。図 3-10 で示した配列変数 D 自体の小さな領域をクリアするものです。配列変数 D に、位置情報 「なし」 というデータを代入するものです。つまり、配列変数 D に、配列実体への参照をとめさせることを意味します。なお、参照されなくなった配列実体は、もう利用できないので、定期的に、使用されないメモリを監視している CLR(Common Language Runtime)の 「ガベージコレクション」 とよばれる機能によって解放されます(図 3-11)。

図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体

図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体

また、配列変数 D が参照型であるということから1ついえることは、配列変数 D と配列の実体という 2 種類の領域がメモリ上に確保されているということです。この 2 種類のメモリ領域を別々に確保するような、以下の書き方もできます。

[例] 配列変数 D と配列の実体を別々に確保する

                  
1: Dim D() As Integer    '参照型の配列変数のみ確保
2: D = New Integer(4){}  '配列の実体を確保

1 行目の宣言は、添え字上限値もなければ初期値のリストもありません。この場合、単純に配列変数である D だけを宣言した意味になります。この宣言では配列の実体は確保されず、配列の実体データを参照する、配列変数 D の小さな領域が確保されるだけです。

2 行目の記述では、新しいキーワード 「New」 が登場しました。New は明示的にメモリを確保する記述で、2 行目の記述によって配列の実体のための領域を明示的に確保しています。メモリ上に確保された領域の位置情報(参照情報)は、代入文の左辺の変数 D に代入されます。つまり、New によって領域を確保するとき、代入文の左辺にくるのは参照型の変数です。

New キーワードの使い方はさまざまなバリエーションがあり、必要に応じて補足しますが、配列の実体を明示的に確保する典型的な書き方は、以下のとおりです。

参照型変数 = New 配列要素の型(添え字上限){}

New の後ろには要素の型を書き、丸括弧( )内に添え字の上限を書きます。これによって要素数は決まります。気を付ける点は、その後ろに括弧 { } をつけてください。括弧 { } をつけないと別の意味になります(詳細は、第 5 章 「クラスの定義と実装」 で説明)。もともと、括弧 { } は初期値リストを書く場所なので、以下のように記述することもできます。この場合、初期値リストのデータの数だけ、要素は確保されます。

参照型変数 = New 配列要素の型(){ データ1, データ2, データ3, ... }

[例] 5 個の要素を確保し、初期値を設定

                  
2: D = New Integer(){ 1, 3, 7, 15, 31 }

New キーワードは、メモリ領域を明示的に確保する重要なキーワードです。特に、第 5 章 「クラスの定義と実装」 のオブジェクト関連の操作では不可欠な表現です。New キーワードについては、第 5 章 「クラスの定義と実装」 で改めて扱います。

基礎知識 & キーワード

◆スタックとヒープ

VB .NET(というよりは .NET Framework の CLR)は、ほかのプログラム実行環境と同様に、データを格納するメモリ上の領域として 「スタック」 と 「ヒープ」 を利用しています。「スタック」 と 「ヒープ」 は、プログラミング用語としては特定の役割をもつメモリ領域を示す言葉です。一般にコンピュータ用語としての 「スタック」 領域は、「First-In Last-Out」 とよばれる 「先入れ後出し」 形式のデータ構造のことをさし、データが上にどんどん積まれ、取り出すときは上から順番に取り出すデータの蓄積形態を意味します。

一般にプログラムでは、この 「スタック」 を内部的に、メソッド呼び出しのための一時的なデータ領域として利用しています。例えば、ローカル変数の領域確保にはスタックが使われています。メソッドが呼び出されるとスタックにローカル変数が確保され、メソッドを抜けて終了すると、スタックからローカル変数が解放されます。もし、メソッド内からさらに別のメソッドを呼び出すと、スタックには新たによばれたメソッドのためのローカル変数領域が確保されます。つまり、メソッドをよぶたびに、スタックにローカル変数の領域が積まれ、メソッドを抜けて呼び出しを終了すると、その分だけスタックはクリアされます。この利用形態が、スタックの特徴である、いわゆる 「先入れ後出し」 方式になっています。ここで 1 つ重要な点は、スタック領域に確保された領域はプログラマが明示的に確保する必要もなく、また明示的に解放する必要もない点です。

なお、スタックは前記のようにどんどんデータを積み上げる構造であることから、連続的な領域である場合が多いですが、CLR 環境ではスタックが必ずしも連続であるとは限りません。しかし、メソッド呼び出しごとに空き領域を CLR が確保し、メソッド呼び出しの終了とともにその領域は解放されるので、「論理的なスタック」 としてとらえることができます。いずれにしても、大切な点は、スタック領域の確保や解放を、プログラマが意識する必要はないということです。

一方、プログラミング用語としての 「ヒープ」 は、プログラマが明示的に確保することが可能な領域を意味し、前述のスタックのようなしくみはありません。ヒープ領域の場合は、メソッド呼び出しに連動して動的に確保されたり、解放されたりするしくみはありません。ヒープには、必要に応じて自由なサイズのメモリ領域を確保できます。New キーワードは、このヒープに明示的に領域を確保する 1 つの方法です。ただし、メモリ確保はプログラマが必要に応じておこないますが、VB .NET などの実行環境である CLR では、メモリ解放はガベージコレクタによって、自動的におこなわれます。

値型と参照型によって、このスタックとヒープの使われ方が違います。値型や参照型のローカル変数自体はスタック領域にあります。参照型の場合、スタックに存在するのは参照情報を保持する変数だけです。それに対して、参照型の変数で参照する配列の実体はヒープに確保されます。

以下の例の場合、配列変数 D1、D2 自体はスタック上のローカル変数ですが、配列の実体はヒープにあります。

[例] 配列のメモリ確保

                        
2: D = New Integer(){ 1, 3, 7, 15, 31 }

◆ガベージコレクション

不要になったヒープ上の領域は、ガベージコレクタによって解放されます。この処理のことを 「ガベージコレクション」 といいます。この機能は CLR(Common Language Runtime)に備わった機能であり、そのため CLR 向けのアプリケーションを開発する VB .NET では、ヒープ領域の解放をプログラマが意識しなくてもよいことになります。

3-3-4 参照型配列変数の基本的な操作

前項で説明したように、配列変数は参照型であり、配列変数自体のメモリ領域は、配列の実体ではなく、配列の実体を参照する位置情報をもつ小さな領域です。このことから、配列変数を操作するうえでいくつか注意点があります。ここでは、配列変数に関する操作について、補足しておきます。

値型変数と参照型変数とでは、「=」 演算子を使った代入文において、その違いが特に現れます。

以下の例において、2 つの変数 X、Y は Integer 型なので値型です。代入文では、その変数の値そのものが代入されるので、変数 X の 100 という値は変数 Y に代入されます。厳密には、これは値の移動ではなく、変数 X の 100 という値のコピーです(図 3-12)。

[例] 値型変数の代入

                  
1: Dim X As Integer = 100  '変数 X に初期値として 100 を設定
2: Dim Y As Integer
3: Y = X  '変数 X の値を変数 Y に代入(コピー)

図 3-12 変数 X に格納された 100 という値が、変数 Y へコピーされる

図 3-12 変数 X に格納された 100 という値が、変数 Y へコピーされる

しかし、参照型ではデータそのものは代入されません。以下の例の 3 行目ではでは、配列変数 D1 の値を、配列変数 D2 に代入しています。この例の 3 行目では、配列の実体を D1 から D2 へ代入している訳ではなく、配列変数 D1 がもつ参照情報を、配列変数 D2 に代入しているのです。

[例] 参照型変数の代入

                  
1: Dim D1() As Integer = { 100, 200, 300, 400 }
2: Dim D2() As Integer
3: D2 = D1

この様子を表したのが図 3-13 ですが、配列の実体である要素がもつ 100、200、300、400 というデータがコピーされる訳でなく、配列変数 D1 に格納された参照情報(下図の nnnn という値)が、配列変数 D2 へコピーされます。

図 3-13 参照情報が D1 から D2 にコピーされる

図 3-13 参照情報が D1 から D2 にコピーされる

その結果、D1(0) ~ D1(3) の要素と D2(0) ~ D2(3) の要素とは一身同体であり、全く同じメモリ領域を表しています。この点は、値型の例とは違います。値型の変数Xと変数Yは、それぞれ個別に 100 というデータをもちました。

なお、ここで説明してきた参照型の特徴は、配列変数に限らず参照型のデータ一般にいえることです。値型変数の代入文ではデータそのもののコピーが代入されますが、参照型変数の代入文ではデータの実体はコピーされず、参照情報のみがコピーされます。

参考  

●参照型としての配列変数

配列を表す変数が参照型であるというのは、VB .NET だけの特別な概念ではありません。C# や C/C++ 言語、Java などのプログラミング言語でも、配列については同じ扱い方をしています。また、もともと参照型という概念は、C# や VB .NET の言語レベルの概念というだけではなく、.NET Framework にある概念です。

そういうことからしても、参照型の概念は重要ですが、初心者には少し難しいところがあります。これから第 5 章 「クラスの定義と実装」 までの内容の中で、繰り返し何回か参照型についての説明があります。それらの説明をみながら、徐々に参照型を実感していただければよいでしょう。

特に、VB .NET では、基本的なレベルでは、それほど参照型を意識しなくてもコードを書くことができます。配列操作についても、3-3-2 「配列の宣言と利用」の範囲内であれば、参照型をそれほど強く意識しなくても問題ありません。そういう意味で、VB .NET は初心者から、.NET Framework 対応の本格的なアプリケーションをつくる上級者まで、幅広い範囲で利用されるプログラミング言語であるといえます。

ワンポイント

● for VB6

VB6 では、配列変数から配列変数への代入は、配列の実体データである要素のコピーでした。この点は、VB .NET とは異なる点です。

[例] VB6 では配列 D1 の要素の各値を配列 D2 にコピーする

                        
1: Dim D1(10) As Integer
2: Dim D2() As Integer  '代入先の配列に添え字は指定しないこと(VB6)
3:   (中略)
4: D2 = D1  'VB6 では値のコピーがされ、新しい配列 D2 ができる

ここで、もう 1 つ参照型の変数について補足します。参照型である配列変数は変数ですので、あとから参照情報を上書きすることができます。そのため、いままで 11 個の要素の配列を表していた配列変数 D について、新たに 21 個の要素をもつ配列に変更したいのであれば、以下のようになります。

[例] 11 個の要素の配列と、21 個の要素の新しい配列の確保

                  
1: Dim D() As Integer
2: D = New Integer(10){}
3:   (中略)
4: D = New Integer(20){}  '以前の参照情報は上書き

4 行目の記述によって、配列変数 D がもつ参照情報は上書きされ、配列変数 D は新たに確保された 21 個の要素からなる配列を参照するようになりました。この時点で、以前の 11 個の要素からなる配列はもう参照されなくなるので、ガベージコレクションによって削除されることになります。なお、1 行目と 2 行目をまとめて、「Dim D(10) As Integer」 と宣言時にあらかじめ、添え字上限を指定しても、4 行目のように配列の参照先を変えることができます。

また、この 4 行目の記述は ReDim ステートメントを使って、以下のように記述できます。この例では、配列変数 D は、新しい要素 21 個の配列を参照します。意味的には、前述の New キーワードを使った要素の確保と同じです。

[例] 21 個の要素を確保(配列変数 D はその新しい配列を参照する)

                  
4: ReDim D(20)

また、ReDim ステートメントでは、新しく配列を確保する際に、既存の要素 11 個の配列のデータをコピーする機能もあります。既存配列の要素をコピーするには、以下のように Preserve キーワードを追加します。これによって、実質的には 11 個の既存配列を、21 個に拡張しているかのように利用できます。

[例] 11 個の要素の配列のデータを生かしたまま、新たに配列確保

                  
4: ReDim Preserve D(20)

1 つ留意する点は、この Preserve をともなう記述は、既存の配列を物理的に拡張しているのではなく、あくまで新しい配列を確保して、その配列に既存配列の値をコピーしている点です。よって、すでに 1001 個の要素をもつ配列 D(添え字は 0~1000)を、以下の 4 行目のように 1011 個に拡張した場合、単に 10 個の要素が追加されるのではなく、新しい 1011 個の配列を確保するうえに、1001 個分の既存データが新しい配列にコピーされる処理が発生します。

[例] 1011 個の配列に変更

                  
1: Dim D() As Integer
2: D = New Integer(1000)
3:   (中略)
4: ReDim Preserve D(1010) '新しい配列に既存データをコピー

3-3-5 多次元配列

VB .NET にも、複数の添え字をもつ多次元配列があります。多次元配列では、丸括弧( )の中に、カンマで区切って添え字を並べます。以下は、どの配列も 3×2 の二次元配列の例です。

[例] 二次元配列

                  
1: Dim T1(2,1) As Integer
2: Dim T2(,) As Integer = { {5,8}, {10,20},{30,40} }
3: Dim T3(,) As Integer
4: T3 = New Integer(2,1){}
5: T1(0,0) = 100
6: T1(0,1) = 200

二次元は、行と列からなるテーブルを表現するときなどに利用しますが、もちろんこのテーブルは仮想的なテーブルであり、メモリ上に、本当に二次元に並んでいる訳ではありません。メモリはリニアな空間(直列的にデータが並ぶ空間)であり、プログラマからみた際に、あたかもテーブルのようにデータを扱えるだけです(ただし、テーブルといってもリレーショナルデータベースのテーブルとは異なり、どの列も同じデータ型です)。

丸括弧( )の中に、複数の添え字をカンマで区切って並べる以外は、いままで説明した配列の使い方と同じです。二次元配列でも参照型には違いなく、配列変数 T1 であれば二次元配列の実体を参照する、以下の構造になっています(図 3-14)。

図 3-14 二次元配列

図 3-14 二次元配列

前述のコードでは 3 個× 2 個の二次元配列なので、配列の宣言は (2,1) である点に注意してください。配列宣言では、あくまで添え字の上限値を指定するのであり、実際の要素数は上限値よりも 1 つ多くなります。

また、1 行目では添え字を指定し、2 行目では初期値を指定しているので、配列の実体が相応の要素数だけ確保されますが、3 行目では配列の実体は確保されず、参照情報を格納する配列変数 T3 のみ確保されます。これは、いままで扱ってきた、添え字が 1 つしかない一次元配列と同じ記述方法です。

また、4 行目にある、New による明示的な配列の実体データの確保も、添え字が 1 つ増えている点以外はいままでと同じです。

なお、2 行目の括弧 { } の初期化では、3×2 を表すように、内側の { } には 2 個を 1 組とするデータがあり、それが 3 組並んでいます。この配列の添え字は、下限 (0,0) から上限 (2,1) までで、2 つのデータをもつ 3 組の初期化リストは、それぞれ (0,0) と (0,1)、(1,0) と (1,1)、(2,0) と (2,1) に対応しており、下位のほうの添え字についての組み合わせをつくります。

3-3-6 多段階配列

多段階配列とは、「配列の配列」 ということができます。配列の要素自体が、ほかの配列を参照する 「参照情報の配列」 です。以下は 2 段階の配列です。この 「段階」 が増えるごとに、丸括弧 ( ) の数が増えてきます。

[例] 2 つの段階をもつ配列

                  
1: Dim D1()() As Integer
2: D1 = New Integer(2)(){}
3: D1(0) = New Integer(){ 20, 39 }     '2 個の要素をもつ配列
4: D1(1) = New Integer(){ 1, 2, 3, 4 } '4 個の要素をもつ配列
5: D1(2) = New Integer(2){}            '3 個の要素をもつ配列
6: D1(2)(1) = 20

個々の構文の意味をみる前に、この構造の概念図を示します(図 3-15)。

図 3-15 2 段階の配列

図 3-15 2 段階の配列

多段階配列では、文字通り、段階を踏んで配列の実体を確保します。

多段階配列の変数 D1 では、最初の段階として、まず 2 行目で New キーワードを使って、配列の参照情報のための配列を用意しています。ここでの要素の数は 3 つです。「New Integer(2)()」 というように、丸括弧( )が 2 つあり、2 番目の丸括弧( )が空であることが、2 段階のまだ途中の段階であることを示しているといえます。ここで確保された配列要素には、データそのものではなく、ほかの配列を参照するための参照情報が入ります。この参照情報が入る配列は、D1(0)、D1(1)、D1(2) という形式で参照できます。

次の段階として、3 行目から 5 行目では 2 行目で確保した配列要素に対して、それぞれ別々の配列の実体を確保し、配列の参照情報を設定しています。すでに説明したように、New キーワードではメモリにデータを確保し、代入文の左辺には参照情報が代入されるので、左辺は参照型データのはずです。D1(0) や D1(1)、D1(2) は、いままで扱ってきたような値型の配列要素ではなく、参照情報をもつことができる参照型の要素です。D1(0) や D1(1)、D1(2) などが、個別に配列変数としても利用できます。

また、要素を参照するときは、段階が増えるにつれて丸括弧( )の数が増えます。6 行目の記述は、2 段階の配列の末端要素(2 段目の要素)にアクセスするときの書き方です。

配列表記における 「D1(2)(1)」 と 「D1(2,1)」 の違いを説明するために、あえてここでは多段階の配列を取り上げました。しかし、多次元配列や多段階配列を利用しなくても、より便利なデータの集合を扱う方法が、.NET Framework クラスライブラリに多数用意されています。そのため、多次元配列や多段階配列を利用する機会はそれほど多くないかもしれません。VB .NET にとって特に重要なのは、第 5 章 「クラスの定義と実装」 の内容でもあるので、多次元配列、多段階配列については、必要に迫られたときに改めて詳しく調べればよく、ざっとどのようなものであるか理解しておけばよいでしょう。

3-3-7 配列サイズの取得

VB .NET では、配列の要素数を取得する記述方法も用意されています。以下のように、「.Length」 と記述すると、その配列変数が参照している配列の要素数がわかります(L だけ大文字です)。

配列変数名.Length

[例] 配列の要素数を調べる

                  
1: Dim Num As Integer
2: Dim D() As Integer = { 10, 20, 40, 80 }
3: Num = D.Length   '要素数 4 が変数 Num に代入される

なお、この記述を多次元配列に使用すると、要素の総数が求められます。

[例] 配列の要素数を調べる

                  
1: Dim Num As Integer
2: Dim D(2,3) As Integer  '3×4 個の二次元配列
3: Num = D.Length         '要素数 12 が変数 Num に代入される

多次元配列で、各次元ごとの要素数を調べる場合、「配列変数名.GetLength()」 を使います。丸括弧( )の中に記述する値(引数)は次元を表し、添え字の左側が最も小さい次元です(GetLength() はメソッドですが、この表記を正確に理解するためには、第 5 章 「クラスの定義と実装」 のクラスに関する知識が必要です。とりあえず、こう表記すると覚えておいても問題ないでしょう)。

[例] 配列の次元ごとの要素数を調べる

                  
1: Dim Num1, Num2 As Integer
2: Dim D(2,4) As Integer  '3×5 個の二次元配列
3: Num1 = D.GetLength(0)  '要素数 3 が変数 Num1 に代入される
4: Num2 = D.GetLength(1)  '要素数 5 が変数 Num2 に代入される

また、多段階配列では、それぞれの段階の要素数を求めることができます。

[例] 多段階配列での要素数を調べる

                  
 1: Dim Num1, Num2, Num3, Num4 As Integer
 2: Dim D()() As Integer
 3: D = New Integer(2)(){}          '最初の段階
 4: D(0) = New Integer(){ 20, 39 }  '次の段階
 5: D(1) = New Integer(){  1,  2,  3,  4 }
 6: D(2) = New Integer(2){}
 7: Num1 = D.Length     '要素数 3 が Num1 に代入(最初の段階の要素数)
 8: Num2 = D(0).Length  '要素数 2 が Num2 に代入
 9: Num3 = D(1).Length  '要素数 4 が Num3 に代入
10: Num4 = D(2).Length  '要素数 3 が Num4 に代入
ワンポイント

● for VB6

VB .NET では、あらゆるデータ型がオブジェクトであり、配列もオブジェクトです。「.Length」 という記述は、このオブジェクトの Length プロパティにアクセスする記述方法です。また、GetLength もこのオブジェクトのメソッドです。

最後に、配列に関するまとめとして、要素数を求める記述も含め、配列に関するサンプルをあげておきます(WinApp2 プロジェクトの Button1_Click イベントハンドラに記述することを想定しています)。

[例] さまざまな配列操作

                  
 1: Private Sub Button1_Click(ByVal sender As System.Object, ...
 2:
 3:     '配列変数と配列実体の基本的な確保
 4:     Dim D1(3) As Integer
 5:     Dim D2() As Integer = {10, 20, 30, 40}
 6:
 7:     '参照情報だけをもつ配列変数 D2 のみ確保
 8:     Dim D3() As Integer
 9:
10:     'M(0)~M(2) までの配列、各要素は String 型
11:     Dim M() As String = {"hello", "hi", "bye"}
12      MsgBox(M(1))     ' "hi" と表示される
13:
14:     D2 = D1 'D1 の配列と D2 の配列は同一(参照情報のコピー)
15:     D2(0) = 300      'D1(0) に値を代入したことに等しい
16:     MsgBox(D1(0))    'D1(0) は300
17:
18:     D3 = New Integer(3) {} 'New による配列要素の確保
19:     MsgBox(D3.Length)      'D3 の要素数は 3
20:
21:  End Sub

<< 前のページ  次のページ>>

目次