連載
» 2018年07月26日 05時00分 公開

.NET TIPS:VB.NETで配列を宣言するには?

VB.NET(Visual Basic .NET)で配列(1次元配列)を使用する場合、その宣言や割り当て、初期化には幾つかの記述方法がある。本稿ではそれらについてまとめる。

[遠藤孝信, 山本康彦,共著]
「.NET TIPS」のインデックス

連載「.NET TIPS」

本稿は2005/03/11に初版公開された記事を改訂したものです。


 VB.NET(Visual Basic .NET)で配列(1次元配列)を使用する場合、その宣言や配列の割り当て、配列の初期化に幾つかの記述方法がある。本稿ではそれらをまとめる。

POINT 配列の宣言

配列の宣言の構文まとめ 配列の宣言の構文まとめ


 特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。

 なお、本稿で示すように、配列の宣言と初期化はややこしい。.NET Framework 2.0以降では、特にパフォーマンスの要求がシビアであるとか、呼び出し先が配列を要求しているとかいった特段の理由がない限り、配列の代わりにList<T>ジェネリックコレクション(System.Collections.Generic名前空間)を使うとよい。

配列の宣言

 まず、配列の宣言には次のように2つの記述方法がある。配列であることを示すかっこは変数名の後ろか型の後ろに記述できる。

Dim arrayA() As String
Dim arrayB As String()

2通りの配列宣言
配列の宣言と同時に割り当てを行う場合には前者(変数名の後ろにかっこを記述)のような書き方しかできないので、前者に統一しておくのがよいだろう。
なお、宣言しただけの配列変数(ここではarrayA/arrayB)の値はNothingである。使う前に、配列オブジェクトを与えて初期化するか、メモリを割り当てる必要がある(後述する)。

 ここでは文字列(String型)の配列を宣言している。このようにして宣言した配列には例えば次のようにして配列オブジェクトを作成し、その参照を代入できる。

arrayA = New String() {"いち", "に", "さん"}
Console.WriteLine(arrayA.Length) ' 出力:3

文字列の配列オブジェクトを作成して配列の変数に代入する例

上のコードを実行した後のメモリの状態 上のコードを実行した後のメモリの状態
配列変数arrayAが、作成した配列オブジェクト(各要素が文字列"いち"/"に"/"さん"を指している)を参照している

配列の宣言と同時に初期化

 上記の例のように、配列を宣言し、初期化した配列オブジェクトを代入する場合には、それら2行のコードを次のようにして1行で記述できる。

Dim arrayC() As String = New String() {"いち", "に", "さん"}

配列を宣言と同時に初期化する例

 そしてこの場合には、「New String()」部分を省略して次のように記述可能だ。

Dim arrayD() As String = {"いち", "に", "さん"} ' New 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[]

Visual Basic 2008からは、配列の宣言と同時に初期化するときに暗黙的な型指定が可能
型を指定する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である。

前述のコードを実行した後のメモリの状態 前述のコードを実行した後のメモリの状態
配列の変数arrayEの後ろに「(3)」と記述すると、作成される配列の要素数は4になる

 ちなみに、この記述方法の場合には、次のように配列の大きさの指定を変数により指定可能だ。

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キーワードでは配列を初期化できない

 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】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。