名前付きの型と匿名型の比較
更新 : 2007 年 11 月
匿名型のインスタンスを宣言するために使用する書式は、名前付きの型のインスタンスをオブジェクト初期化子を使用して宣言するときに使用する書式に似ています。ただし、結果には重要な違いがあります。
宣言
次の例では、product1 は匿名型のインスタンスであり、product2 は Product クラスのインスタンスです。どちらの宣言でも、宣言内で初期化リストを使用します。この 2 つの宣言の間での、唯一の構文上の違いは、product1 の New の後ろにデータ型の指定がないことです。これにより、インスタンスは匿名型になります。
' Variable product1 is an instance of an anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
変数 product1 は、匿名型のインスタンスとして、厳密に型指定されます。コンパイラは、宣言内に指定されたプロパティに従って、この型を定義します。コンパイラは、ローカル型の推論を使用して、指定された初期値からプロパティのデータ型を決定します。この例では、匿名型には Name プロパティと Price プロパティが格納されるので、それらの型は、それぞれ String と Double であると推論されます。
メモ : |
---|
前の例では、キー プロパティとして指定されたプロパティはありません。したがって、これらのプロパティは、型が同じ 2 つのインスタンスが同等であるかどうか、インスタンスのハッシュ コード値は何かの決定には関係しません。ただし、これらのプロパティの値は変更できますが、キー プロパティの値は読み取り専用です。キー プロパティの詳細については、「匿名型」を参照してください。 |
次の例では、product2 は、Product クラスのインスタンスとして厳密に型指定されます。Name と Price は、両方とも Product クラスのメンバである必要があり、それらの型は、宣言内に指定される型と互換性がなければなりません。
' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}
詳細については、「オブジェクト初期化子 : 名前付きの型と匿名型」を参照してください。
宣言の違い
2 つの宣言のその他の点を比較した一覧を次に示します。
ローカル型の推論によって、product1 は匿名型のインスタンスであり、product2 は Product クラスのインスタンスであることが決定されます。どちらの宣言にも、As 句の指定はありません。ただし、product2 では、As 句は省略可能です。
匿名型には指定された名前がないので、As 句を使用して product1 を宣言することはできません。その型は推論される必要があります。これは、ローカル変数に対する匿名型の使用を制限します。
product2 は名前付きの型Product のインスタンスなので、型の推論を用いずに、As 句を使用して宣言できます。
Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
Product 内に適切なコンストラクタが定義された場合、product2 を宣言し、オブジェクト初期化子を使用せずに初期化できます。
Dim product2b As New Product("paperclips", 1.29)
または、次の一連のステートメントにも同じ効果があります。
Dim product2c As New Product product2c.Name = "paperclips" product2c.Price = 1.29
product1 の場合、そのプロパティには名前があり、初期化子リスト自体に定義されているので、同じように宣言することはできません。
product1、product2、およびそれぞれのプロパティは、すべて厳密に型指定されているので、IntelliSense を使用して、これらのオブジェクトのいずれかを使用するコード内を移動できます。
注意 : 匿名型の名前は、コンパイラによって生成されるので、コンパイルするたびに変更される可能性があります。プロジェクトの再コンパイル時に変更される可能性があるので、コード内で匿名型の名前を使用したり、依存したりすることは避けてください。