【入門編】初心者向け:VB.NETの配列宣言における「New」の省略とサイズ指定の罠:初期化ミスを防ぐための基本事項 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

配列宣言の「New」省略とサイズ指定の落とし穴:VB.NETで初期化ミスを防ぐ基本をマスターしよう!

やあ、みんな! プログラミングの世界へようこそ! Visual Basic (.NET) の世界は、時にそのシンプルさゆえに、ちょっとした落とし穴が潜んでいることがあります。特に、データをまとめて扱う「配列」を使い始めたばかりの君たちにとって、宣言と初期化のタイミングは、ちょっとした迷いどころかもしれません。

今回は、そんな配列宣言でよくある「New」の省略や、サイズ指定の勘違いに焦点を当てて、初心者の方が陥りがちなミスを防ぎ、自信を持って配列を使えるようになるための基本を、優しく、そしてしっかりと解説していくよ。ここをクリアすれば、VB.NETの配列操作の基本はバッチリだから、安心してついてきてね!

配列って、そもそも何がいいの?

いきなり配列の話に入る前に、なぜ配列を使うのか、そのメリットを軽くおさらいしておこう。

例えば、10人分の点数を記録したいとき、変数で一つずつ宣言すると、こんな風になるよね。

.net
Dim score1 As Integer
Dim score2 As Integer
‘ … (score3 から score10 まで続く)

これだと、変数名がバラバラで管理しにくいし、もし100人分だったら…想像するだけで大変だ!

そこで配列の出番だ。配列を使えば、同じ型のデータをまとめて、インデックス(添え字)で管理できるようになる。

.net
‘ 10人分の点数を格納できる配列を宣言
Dim scores(9) As Integer ‘ サイズは0から9までの10個

たった1行で、10個のInteger型データを格納できる箱(配列)ができた。まるで、整理整頓された引き出しみたいだね。この「scores」という名前の引き出しの中に、scores(0)、scores(1)、scores(2)…と、10個の仕切りがあるイメージだ。

「New」の省略、なぜできる? そして、その落とし穴とは?

さて、配列を宣言する際に、こんな書き方を見たことがあるかもしれない。

.net
‘ パターンA: New を省略した宣言
Dim numbers(4) As Integer

‘ パターンB: New を明示的に使った宣言
Dim names() As String = New String(3) {}

あれ? パターンAでは「New」って書いてないけど、これで配列が作れるの? と思った君、鋭い!

VB.NETでは、配列のサイズを指定して宣言する場合、`New` キーワードを省略できるんだ。この場合、VB.NETコンパイラが自動的に `New` を補って、指定されたサイズの配列を生成してくれる。

.net
‘ Dim numbers(4) As Integer は、実質的に
‘ Dim numbers As Integer() = New Integer(4) {} と同じ意味

ここがポイント! サイズ指定と同時に宣言する場合、`New` を省略しても、配列はちゃんとメモリ上に確保され、初期値(数値型なら0、参照型ならNothing)で初期化される。だから、この書き方自体は問題ないんだ。

では、どこに「罠」があるのか? それは、サイズを指定せずに宣言した場合に起こりやすい。

例えば、こんなコードを考えてみよう。

.net
‘ サイズを指定せずに配列を宣言
Dim fruits() As String

‘ この時点では、fruits はまだメモリ上に確保されていない (Nothing)

この `fruits` は、まだ「配列そのもの」が作られていない状態なんだ。まるで、「果物用の箱を用意するよ」と宣言しただけで、まだ箱自体は作っていないようなもの。

もし、この状態で `fruits` の要素にアクセスしようとすると、どうなるだろう?

.net
‘ エラー発生! System.NullReferenceException
‘ fruits Is Nothing で、配列がまだ存在しないため
‘ fruits(0) = “Apple”

ここで、プログラマーがよく遭遇する `System.NullReferenceException` というエラーが発生する。これは、「存在しないもの(Nothing)を使おうとしたよ!」という、VB.NETからの悲鳴なんだ。

初期化ミスを防ぐための正しい構文と実例

この `NullReferenceException` を避けるためには、配列を使う前に、必ず「配列そのもの」をメモリ上に確保し、初期化する必要がある。そして、そのための基本的な構文は2つある。

1. サイズ指定と同時に宣言する(New省略可)

これが一番シンプルで、初心者のうちはこの方法を覚えるのがおすすめ。

.net
‘ サイズを5(インデックスは0~4)として宣言
‘ New は省略できる
Dim temperatures(4) As Double

‘ この時点では、temperatures は Double 型の配列としてメモリ上に確保され、
‘ 各要素は 0.0 で初期化されている。
‘ だから、すぐに要素にアクセスできる!

temperatures(0) = 25.5
temperatures(1) = 26.0
Console.WriteLine(temperatures(0)) ‘ 25.5

コードのポイント:

  • `Dim temperatures(4) As Double`:サイズを5(インデックス0から4)で宣言。Double型の配列が生成され、各要素は自動的に`0.0`で初期化されます。
  • 宣言直後に `temperatures(0) = 25.5` のように代入してもエラーになりません。

2. サイズを指定せずに宣言し、後からNewで初期化する

後からサイズが決まる場合や、初期化するタイミングを分けたい場合は、この方法を使う。

.net
‘ サイズを指定せずに宣言(この時点では Nothing)
Dim colors() As String

‘ 後からサイズを3(インデックスは0~2)として初期化
‘ Newキーワードは必須!
colors = New String(2) {}

‘ これで colors は String 型の配列としてメモリ上に確保され、
‘ 各要素は Nothing で初期化される。
‘ 準備ができたので、要素にアクセスできるようになる!

colors(0) = “Red”
colors(1) = “Green”
colors(2) = “Blue”

Console.WriteLine(colors(0)) ‘ Red

コードのポイント:

  • `Dim colors() As String`:配列の宣言のみ。この時点では `colors` は `Nothing` です。
  • `colors = New String(2) {}`:ここで初めて `New` キーワードを使って、サイズ3(インデックス0~2)のString型配列を生成します。各要素は文字列の初期値である `Nothing` で初期化されます。
  • この後、`colors(0) = “Red”` のように代入できるようになります。

3. 初期化子を使って宣言と同時に初期化する

さらに便利なのが、宣言と同時に要素の値を指定する方法だ。

.net
‘ 宣言と同時に、3つの要素を持つ配列を初期化
‘ New もサイズ指定も省略できる!
Dim weekdays() As String = {“Monday”, “Tuesday”, “Wednesday”}

‘ この時点では、weekdays は String 型の配列としてメモリ上に確保され、
‘ 要素は指定した値で初期化されている。

Console.WriteLine(weekdays(1)) ‘ Tuesday

コードのポイント:

  • `Dim weekdays() As String = {“Monday”, “Tuesday”, “Wednesday”}`:`{}` を使って、宣言と同時に配列の初期値を指定します。この場合、`New` キーワードやサイズ指定は不要です。配列のサイズは、指定された要素の数(この場合は3つ)によって自動的に決まります。

陥りやすい「サイズ指定の罠」

ここで、もう一つ注意しておきたいのが、配列の「サイズ指定」の考え方だ。

VB.NETの配列は、0から始まるインデックスを持つ。だから、`Dim myArray(4) As Integer` と宣言した場合、これは5つの要素を持つ配列(インデックスは 0, 1, 2, 3, 4)になるんだ。

初心者がよく間違えるのは、例えば「10個の要素が欲しいから `Dim myArray(10) As Integer`」と書いてしまうこと。これだと、インデックスは0から10までの11個になってしまう! 意図した数より1つ多くなってしまうので、後々「あれ? 思ったより要素が多いぞ?」とか、「ループで範囲を間違えた!」といった混乱の原因になることがある。

対策:

  • 「要素数 – 1」がインデックスの最大値だと常に意識する。
  • もし「10個の要素が欲しい」と明確にしたい場合は、`Array.CreateInstance` メソッドを使うか、`Dim myArray(9) As Integer` と書くのが一般的。
  • あるいは、`List(Of T)` コレクションを使うことも検討する。(これはまた別の機会に詳しく解説しよう!)

まとめ:迷ったら、この確認を!

配列宣言で「あれ?」と思ったら、以下の2点を確認してみよう。

1. 配列は「箱」そのものが作られているか? (Newされているか?)

  • サイズ指定ありの宣言 (`Dim arr(5) As Integer`) なら、自動的にNewされる。
  • サイズ指定なしの宣言 (`Dim arr() As String`) の場合は、後から `arr = New String(5) {}` のように `New` で初期化する必要がある。
  • 初期化子 (`Dim arr() As Integer = {1, 2, 3}`) を使えば、宣言と同時にNewされる。

2. インデックスの数え方は合っているか? (0から始まる!)

  • `Dim arr(N)` は、`N+1` 個の要素を持つ。

これらの基本をしっかり押さえておけば、`NullReferenceException` に悩まされることも減るはずだ。配列はVB.NETの強力な武器になる。この機会に、配列の基本をマスターして、君のプログラミングの世界をぐっと広げていこう!

もし、もっと具体的なコード例や、配列を使った応用的なテクニックについて知りたいことがあれば、遠慮なく質問してね。いつでも応援しているよ!

タイトルとURLをコピーしました