ここではVB.NETでの配列の宣言と操作について見ていきます。
配列の宣言と要素の参照・初期化
配列の宣言と個々の要素を参照する方法はVB6以前からと同じです。 配列(インデックス)
のように配列の後ろに丸括弧( )
を記述し、その中にインデックス(添え字)を指定することで配列内の個々の要素を参照します。
ただし、VB6以前の配列ではインデックスの下限と上限の両方を指定することができましたが、VB.NETでの配列はCなどと同様にインデックスの下限は0に固定されています。
配列の宣言時にインデックスを指定しない場合は、配列は作成されず他の配列を代入するための変数となります。 したがって、インデックスを指定した宣言では配列の作成と代入を同時に行なっていると見ることもできます。
インデックスを指定せずに配列変数を宣言した場合、その変数にはNothing
が格納されます。 その状態で配列の要素を参照しようとすると例外NullReferenceExceptionがスローされます。
また、配列の範囲外を参照しようとした場合には、実行時に例外IndexOutOfRangeExceptionがスローされます。
配列の宣言と同時に値を格納して初期化するには、次のように中括弧{ }
を使って格納する値を指定します。
すでに作成されている配列を初期化(クリア)するにはArray.Clearメソッドを使います。
実行時に配列の要素数(配列の長さ)を調べるには、配列のLength
プロパティを参照します。
配列の宣言時に-1
を指定するか、中括弧{ }
だけを記述した初期値を指定することで空の配列を作成することができます。 空の配列は格納できる要素数が0であるため、要素を格納することはできません。 空の配列はNullReferenceExceptionが発生するのを避ける目的でNothing
を指定する代わりとして使用することがあります。
その他、配列の宣言と作成や初期値の設定方法については配列の宣言・初期化・基本操作でも詳しく解説しています。
多次元配列
多次元配列は次のように宣言します。
多次元配列において、各次元毎の長さ(サイズ)を取得するにはGetLength
メソッドを使います。 多次元配列ではLength
プロパティは全要素数を返します。
Rankプロパティ
を参照すると、配列の次元数を取得することができます。
多少複雑になりますが、多次元配列でも通常の配列と同様に中括弧{ }
を使って初期値を指定することができます。 { }
が個々の次元を表している点に注目してください。
次のコードはこれと同じ要素を格納した配列を作成するためのコードです。
多次元配列の他にも、ジャグ配列と呼ばれる配列を宣言することも出来ます。 多次元配列やジャグ配列とその詳細、および初期化などの方法については多次元配列・ジャグ配列で解説しています。
配列と繰り返し構文
繰り返しのステートメントでも解説しているとおり、配列ではForステートメントとFor-Eachステートメントを使って繰り返しを行うことができます。
上記の例では配列の先頭から末尾を順に走査して内容を表示しています。 逆に、末尾から先頭への逆順で走査したい場合、Forステートメントでは次の例のようにStep -1
を指定することでカウンタ変数をカウントダウンさせるようにします。
For Eachステートメントの場合は、それだけでは逆順に走査することはできません。 Array.Reverseメソッドで配列をあらかじめ逆順に並べ替えてから走査するか、逆順で走査するためのReverse拡張メソッド(LINQ)を使用する必要があります。
Array.Reverseメソッドでは配列の内容を変更して逆順にします。 一方Reverse拡張メソッドを使った場合は、元の配列の内容は一切変更されません。
配列の複製・コピー
配列は参照型であるため、次の例のように代入を行なっても、配列自体が複製されるのではなく同一の配列を参照するだけとなります。
配列を複製するにはCloneメソッドを使います。 これにより、内容が全く同じ配列を作成することができます。 このメソッドの戻り値はObject
なので、DirectCastを使って目的の配列型にキャストする必要があります。
配列の一部または全部を別の配列へコピー(複写)するにはArray.Copyメソッドを使います。 Array.Copy(コピー元配列, コピー先配列, コピーする要素数)
のように引数を指定します。 コピーされない部分はそのまま維持されます。
Array.Copy(コピー元配列, コピー元の最初のインデックス, コピー先配列, コピー先の最初のインデックス, コピーする要素数)
のように引数を指定すると、コピー元・コピー先の位置を指定した上でコピーを行うことができます。
コピーする要素数がコピー元・コピー先のサイズを超える場合、インデックスがコピー先・コピー元の範囲外となる場合は例外ArgumentExceptionがスローされます。
動的配列・配列のサイズ変更
格納したい要素数が不確定な場合など、動的に配列のサイズを変えることが必要となる場合には、配列よりもListクラスなどの動的配列を実装したクラスを使うことが推奨されます。
ですが、ここではVB.NET固有の機能を紹介する目的で、VB.NETの構文で動的配列を扱う方法について見ていきます。
ReDim
ReDim
ステートメントを使うことにより、配列のサイズを動的に変更することができます。 ReDim
ステートメントでは配列のサイズを拡張することも縮小することもできます。
ReDim
だけを用いて配列を宣言することはできません。 つまり、必ず既存の配列を指定するか、先に配列を格納する変数を宣言しておかなければなりません。
多次元配列の場合でも同様にReDim
を使用して動的に要素数を変更することができます。
ReDim
ステートメントは、実際には指定された配列のサイズを変更するのではなく、指定されたサイズの配列を新しく作成して配列変数に格納しなおします。 そのため、ReDim
の前後では変数に格納されている配列は別々の配列となります。
したがって、次の実行結果からもわかるようにReDim
ステートメントでは配列のサイズを変更すると内容がすべてクリアされるような結果となります。
ReDim Preserve
ReDim
を使って配列のサイズを変更する際に、配列の内容を維持したい場合にはPreserve
を付け加えます。
このほか、Array.Resizeメソッドを使うことでも内容を維持したまま配列のサイズを変更することができます。
多次元配列の場合、ReDim Preserve
では一番最後の次元のサイズのみを変更することができます。 それ以外の次元のサイズを変更しようとした場合には例外ArrayTypeMismatchExceptionがスローされます。
多次元配列の内容を維持したまま各次元のサイズを変更するには、新たなサイズで多次元配列を作成しなおして、要素を一つずつコピーしていく必要があります。
配列のプロパティ・メソッド
VB.NETの配列は、Arrayクラスから派生したオブジェクトとなっています。 そのため、配列はいくつかのプロパティやメソッドを持っています。 ここではその紹介のみを行います。 詳細な解説については配列操作を参照してください。
ここではArrayクラスのメソッドの例として、
- 配列の要素の並べ替えを行うSortメソッド
- 配列の内容を反転するReverseメソッド
- 指定した内容を含む要素を検索してそのインデックスを取得するIndexOfメソッド
- 配列の内容を初期化するClearメソッド
を使用しています。
このほかにもArrayクラスには様々なメソッドが用意されています。 メソッドによっては多次元配列が扱えないものも存在します。 Arrayクラスのメソッドについてより詳しくは配列操作をご覧ください。