オブジェクト初期化子は、1 つのステートメントで型のコンストラクタを呼び出して一部または全部のプロパティの値を設定する、簡単な方法を備えています。コンパイラは、ステートメントに適したコンストラクタを呼び出します。つまり、引数がない場合は既定のコンストラクタを使用し、引数が 1 つでもある場合はパラメータ化されたコンストラクタを使用します。その後、初期化子リストで指定されている順序で、指定したプロパティが初期化されます。
初期化子リストでの各初期化では、クラスのメンバに初期値が代入されます。メンバの名前とデータ型は、クラスが定義されるときに決定されます。次の例では、Customer クラスが存在し、文字列値を受け付ける Name および City という名前のメンバを持っている必要があります。
Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", _
.City = "Louisville"}
または、次のコードを使用して同じ結果を得ることもできます。
Dim cust1 As New Customer With {.Name = "Toni Poe", _
.City = "Louisville"}
これらの各宣言は、次の例と同等です。この例では、既定のコンストラクタを使用して Customer オブジェクトを作成した後、With ステートメントを使用して Name プロパティと City プロパティの初期値を指定しています。
Dim cust2 As New Customer()
With cust2
.Name = "Toni Poe"
.City = "Louisville"
End With
Customer クラスに、Name の値を指定できるようにするパラメータ化されたコンストラクタが含まれる場合は、たとえば、次のような方法で Customer オブジェクトを宣言して初期化することもできます。
Dim cust3 As Customer = New Customer("Toni Poe") _
With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") _
With {.City = "Louisville"}
次のコードで示すように、すべてのプロパティを初期化する必要はありません。
Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}
ただし、初期化リストは空にできません。初期化しないプロパティは既定値のままになります。
名前付きの型での型の推論
オブジェクト初期化子とローカル型の推論を組み合わせることで、cust1 を宣言するためのコードを短縮できます。この方法を使用すると、変数宣言での As 句を省略できます。変数のデータ型は、代入によって作成されるオブジェクトの型から推論されます。次の例では、cust6 の型は Customer です。
Dim cust6 = New Customer With {.Name = "Toni Poe", _
.City = "Louisville"}
名前付きの型についての解説
オブジェクト初期化子リストでクラスのメンバを 2 回以上初期化することはできません。cust7 の宣言はエラーになります。
'' This code does not compile because Name is initialized twice.
' Dim cust7 = New Customer With {.Name = "Toni Poe", _
' .City = "Louisville" _
' .Name = "Blue Yonder Airlines"}
メンバは、それ自体または別のフィールドの初期化に使用できます。次の例での cust8 の宣言のように、初期化する前のメンバにアクセスすると、既定値が使用されます。オブジェクト初期化子を使用する宣言が処理されるとき、最初に行われるのは、適切なコンストラクタの呼び出しです。その後、初期化子リストの個別のフィールドが初期化されます。次の例では、cust8 には Name の既定値が代入され、cust9 には初期化された値が代入されます。
Dim cust8 = New Customer With {.Name = .Name & ", President"}
Dim cust9 = New Customer With {.Name = "Toni Poe", _
.Title = .Name & ", President"}
次の例では、cust3 と cust4 のパラメータ化されたコンストラクタを使用して、cust10 と cust11 を宣言および初期化しています。
Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
' --or--
Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
オブジェクト初期化子は入れ子にできます。次の例では、AddressClass は 2 つのプロパティ City と State を持つクラスであり、Customer クラスには AddressClass のインスタンスである Address プロパティがあります。
Dim cust12 = New Customer With {.Name = "Toni Poe", _
.Address = New AddressClass _
With {.City = "Louisville", _
.State = "Kentucky"}}
Console.WriteLine(cust12.Address.State)
初期化リストは空にできません。
Object 型のインスタンスを初期化することはできません。
初期化するクラスのメンバとして、共有メンバ、読み取り専用メンバ、定数、またはメソッド呼び出しを指定することはできません。
インデックス付きのクラス メンバまたは修飾されたクラス メンバは初期化できません。次の例では、コンパイラ エラーが発生します。
'' Not valid.
' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}
' Dim c2 = New Customer with {.Address.City = "Springfield"}