■ 配列のインデックス
- 配列のインデックスは 0 から始まる
Visual Basic 6.0 では、任意の上限、下限を持つ配列を宣言することができました。また、Option Baseステートメントで下限を指定しなかった時のデフォルトを 「0 (デフォルト)」 または 「1」 に指定することもできました。
Visual Basic .NET では、他の .NET 言語との相互利用性を重視し、インデックスの下限は必ず 「0」、つまり 0 オリジンの配列になります。上限については、従来と変更はありません (PlusOne 参照)。
また、「インデックスは必ず 0 から」 になるため、Option Base ステートメントはなくなりました。
Dim array(5) As Integer
は、Visual Basic 6.0 でも Visual Basic .NET でも、インデックスが 0~5 までの要素数6の配列を宣言したことになります。
ちなみに、Visual Basic 6.0 で記述可能だった、
Dim array (10 to 12) As Integer
という宣言は、Visual Basic .NET ではできません。
アップグレードウィザードにより 「Option Base ステートメント」 は削除されます。
また、インデックスの下限が 0 以外の配列は 0 オリジンの配列に変更され、アップグレードコメントが付加されます。
[ Visual Basic 6.0 のコード]
Dim array(10 To 12) As Integer '要素数 3
[ Visual Basic .NET にアップグレード]
Dim array(12) As Short '要素数 13
このときの要素数に注目してください。確かにこの配列を利用していたプログラムは引き続き配列を利用できますが、このままでは使われていない無駄な領域が存在することになります!!
そこで、効率よくメモリを利用するために、手動でコードを変更しなくてはなりません。
このような手動による変更をしなくてすむようにするためには、Visual Basic 6.0 のプログラムでも、できるだけ 0 オリジンの配列を利用しておくとよいでしょう。
Visual Basic .NET で、0 オリジンでない配列を使いたいときは、配列ラッパークラスを使うこともできます。ただし、配列ラッパークラスはネイティブな配列よりも低速であるだけでなく、配列型のパラメータを取る .NET Framework 関数に渡したり、C# .NET または VC++ .NET のプログラムに渡したりすることができないため、お勧めできません。
Visual Basic 6.0 からの変更点として、Visual Basic .NET では、他の言語との相互運用性を重視しインデックスの下限は 「0」 となりましたが、上限は VC++ .NET や C# .NET とは異なります。
各言語での配列宣言の例は次の通りです。
[C# .NET の場合]
int [] ar = new int[5]; // 要素数 5 (インデックスは 0~4)
[VC++ .NET の場合]
System::Int32 ar[] = _gc new System::Int32[5]; // 要素数 5 (インデックスは 0~4)
[ Visual Basic .NET の場合]
Dim ar(5) As Integer ' 要素数 6 (インデックスは 0~5)