.NET 4.0 そして Visual Studio 10と一緒にリリースされる予定のVisual Basic 10に、コレクションと配列の初期化子のサポートが加わる。これらは、C#がすでに持っているものに似ているが、拡張メソッドや改善された型推論のサポートのような小さな機能改善もある。
コレクション初期化子
C#のように、Visual Basicのコレクション初期化子は、IEnumerable とAddメソッドを実装したクラスで機能する。しかしC#と違って、Addメソッドは、拡張メソッドで定義してもよい。そのシンタックスもC#に似ているが “From” キーワードが余分に要る。
var x = new List<String>() {"Item1", "Item2"}
Dim x As New List(Of String) From {"Item1", "Item2"}
Addメソッドに複数のパラメータで渡すのも、非常に似ている。
var x = new Dictionary<int, string>(){{1, "Item1"}, {2, "Item2"}}
Dim x As New Dictionary(Of Integer, String) From {{1, "Item1"}, {2, "Item2"}}
C#では、シンタックスに少し曖昧さがあるために、プロパティ初期化子とオブジェクト初期化子をいっしょに扱うことができない。キーワード “With” と “From”を使って、VBでは、この制限がなくなり、1つのステートメントに2つを一緒にできると思うかもしれない。不幸にして、そうはできないので、次のシンタックスは、許されない。
Dim x as New List(Of Integer) With {.Capacity = 10} From {1,2,3}
VBがC#に倣っている別のものに、例外の扱い方がある。コレクションに何かを加えている時に、例外が発生すると、全オペレーションがアボートされ、コレクション変数は、変わらないままである。
配列初期化子
配列初期化子が型推論をサポートするようになったので、タイプするコード量がずいぶん減った。下の例でわかるように、カッコ{ }内に配列の中身があれば、配列が作られることと、何の型なのかの両方を推論するのに十分である。
Dim x = {1, 2, 3}
一方、VBの前バージョンでは、配列を意味するのに空のカッコ()が必要だった。そして特に型が明示されなければ、変数はオブジェクト配列として定義した。
Dim x As Integer() = {1, 2, 3} ‘整数配列
Dim x() = {1, 2, 3} ‘オブジェクト配列
多次元配列とジャグ配列(配列の配列)の両方がサポートされた。後者は、各配列をカッコで囲んだちょっとぶかっこうなシンタックスであるが。
Dim multi = {{1, 2}, {3, 4}}
Dim jagged()() = {({1, 2}), ({3, 4, 5})}
配列初期化子は、関数呼び出しの代わりにインラインも使える。