VB.NETで配列を宣言するには?:.NET TIPS
VB.NET(Visual Basic .NET)で配列(1次元配列)を使用する場合、その宣言や割り当て、初期化には幾つかの記述方法がある。本稿ではそれらについてまとめる。
本稿は2005/03/11に初版公開された記事を改訂したものです。
VB.NET(Visual Basic .NET)で配列(1次元配列)を使用する場合、その宣言や配列の割り当て、配列の初期化に幾つかの記述方法がある。本稿ではそれらをまとめる。
特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。
なお、本稿で示すように、配列の宣言と初期化はややこしい。.NET Framework 2.0以降では、特にパフォーマンスの要求がシビアであるとか、呼び出し先が配列を要求しているとかいった特段の理由がない限り、配列の代わりにList<T>ジェネリックコレクション(System.Collections.Generic名前空間)を使うとよい。
配列の宣言
まず、配列の宣言には次のように2つの記述方法がある。配列であることを示すかっこは変数名の後ろか型の後ろに記述できる。
Dim arrayA() As String
Dim arrayB As String()
配列の宣言と同時に割り当てを行う場合には前者(変数名の後ろにかっこを記述)のような書き方しかできないので、前者に統一しておくのがよいだろう。
なお、宣言しただけの配列変数(ここではarrayA/arrayB)の値はNothingである。使う前に、配列オブジェクトを与えて初期化するか、メモリを割り当てる必要がある(後述する)。
ここでは文字列(String型)の配列を宣言している。このようにして宣言した配列には例えば次のようにして配列オブジェクトを作成し、その参照を代入できる。
arrayA = New String() {"いち", "に", "さん"}
Console.WriteLine(arrayA.Length) ' 出力:3
配列の宣言と同時に初期化
上記の例のように、配列を宣言し、初期化した配列オブジェクトを代入する場合には、それら2行のコードを次のようにして1行で記述できる。
Dim arrayC() As String = New String() {"いち", "に", "さん"}
そしてこの場合には、「New String()」部分を省略して次のように記述可能だ。
Dim arrayD() As String = {"いち", "に", "さん"} ' New String()を省略
型推論による初期化
Visual Basic 2008からは、初期化に使うオブジェクトから変数の型をコンパイラが推論できるようになった。これにより、型の指定を省略してローカル変数を宣言できる。これを暗黙的な型指定という。
配列の宣言と同時に初期化する場合、次のコードのように変数の型も省略できる。
Dim arrayX = {1, 2, 3}
Console.WriteLine(arrayX.GetType().Name) ' 出力:Int32[]
Dim arrayY = {"いち", "に", "さん"}
Console.WriteLine(arrayY.GetType().Name) ' 出力:String[]
Dim arrayZ = {1, 2, 3.0F}
Console.WriteLine(arrayZ.GetType().Name) ' 出力:Single[]
型を指定するAsキーワードが全くないが、VB6のVariant型でもなければ、VB 2005までのようにObject型になるわけでもない。
コンパイル時に右辺の配列オブジェクトから型推論によって変数の型が決定される。上から順に、Integer型の配列/String型の配列/Single型の配列になっている。
なお、暗黙的な型指定が可能なのは、コンパイルオプション「Option Infer」がOnのときである。プロジェクト作成時に既定でOnになっている。
配列の宣言と同時に割り当て
配列は、その宣言時に配列の大きさを指定することにより、宣言と割り当てを同時に行える。ただしこれは、次のように変数名の後ろにかっこを記述した場合のみである。
Dim arrayE(3) As String
Console.WriteLine(arrayE.Length) ' 出力:4
次のような記述はコンパイルエラーとなる。
Dim arrayF As String(3) ' コンパイルエラーとなる
この場合に注意が必要なのは、割り当てられた配列の要素数は「指定した値+1」となる点だ(上記の場合には「(3)」と記述しているので、配列の要素数は4となる)。つまりこれは配列の要素数ではなく、配列の最後の要素のインデックス番号(添字の上限値)を指定していることになる。なおVB6と異なり、VB.NETでは配列のインデックス番号の始まりは常に0である。
ちなみに、この記述方法の場合には、次のように配列の大きさの指定を変数により指定可能だ。
Dim num As Integer = 3
Dim arrayG(num) As String
Console.WriteLine(arrayG.Length) ' 出力:4
後から割り当て
配列を宣言しておいて、後から動的に割り当てるには次のコードのようにReDimステートメントを使う。ReDimは、その語感から既存の配列のサイズを変更するものに思えるかもしれないが、実際には配列オブジェクトを新しく作って配列変数の参照先を置換するのである。
Dim arrayW() As String
Console.WriteLine(arrayW Is Nothing) ' 出力:True
'arrayW = New String(3) ' コンパイルエラーとなる
ReDim arrayW(3)
Console.WriteLine(arrayW.Length) ' 出力:4
配列変数を宣言しただけでは、その変数の値はNothingである(2行目)。配列の要素が空(=要素数がゼロ)なのではなくて、変数の参照しているオブジェクトが何もない状態だ。
また、後から「arrayW = New String(3)」などとして配列オブジェクトを割り当てることはできない。
このようにReDimステートメントを使うか、ArrayクラスのResizeメソッドやCreateInstanceメソッドを利用する。
As Newキーワードによる配列の初期化は不可
VB.NETでは、As Newキーワードにより変数の宣言とその初期化(インスタンス作成および代入)が可能だが、配列の場合にはAs Newキーワードは使用できない。
Dim arrayH(3) As New String ' コンパイルエラーとなる
As Newキーワードの場合、配列を示すかっこを変数名ではなく型の後ろに記述するとコードの意味が変わってくる。例えば次の記述はコンパイル可能だが、これはDecimal型の配列を割り当てているわけではない。
Dim arrayI As New Decimal(3)
Console.WriteLine(arrayI) ' 出力:3
これは単にDecimal構造体(System名前空間)のコンストラクタを呼び出していることになる(カッコ内の「3」はコンストラクタのパラメーターとなる)。VB.NETでは、配列のインスタンス化とコンストラクタの呼び出しを混同しやすいので注意してほしい。
利用可能バージョン:Visual Basic .NET 2002以降(一部、Visual Basic 2008以降)
カテゴリ:Visual Basic .NET 処理対象:データ型
使用ライブラリ:Arrayクラス(System名前空間)
使用ライブラリ:Decimal構造体(System名前空間)
関連TIPS:C#で配列を宣言するには?
関連TIPS:配列のサイズを変更するには?(Resize編)[2.0のみ、C#、VB]
関連TIPS:ArrayListとListの違いとは?[C#/VB]
更新履歴
【2018/07/26】型推論を利用した配列宣言の方法と配列を宣言した後で割り当てる方法を追加するとともに、図版の追加、リストや図へのキャプションの追加など、全般的な構成の変更を行いました。
【2005/03/11】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.