Key (Visual Basic)

Key キーワードを使用すると、匿名型のプロパティの動作を指定できます。 キー プロパティとして指定したプロパティのみが、匿名型インスタンス間の等価性のテスト、またはハッシュ コード値の計算に関与します。 キー プロパティの値は変更できません。

匿名型のプロパティをキー プロパティとして指定するには、初期化リストでその宣言の前にキーワード Key を配置します。 次の例では、AirlineFlightNo はキー プロパティですが、Gate は違います。

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
                        Key .FlightNo = 3554, .Gate = "C33"}

新しい匿名型を作成すると、Object から直接継承されます。 コンパイラによって、継承された 3 つのメンバー (EqualsGetHashCode、および ToString) がオーバーライドされます。 EqualsGetHashCode に対して生成されるオーバーライド コードは、キー プロパティに基づきます。 型にキー プロパティがない場合、GetHashCodeEquals はオーバーライドされません。

等価比較

2 つの匿名型のインスタンスは、それらが同じ型のインスタンスであり、それらのキー プロパティの値が等しい場合に等しいとされます。 次の例で、flight2 は、前の例の flight1 と等しくなります。それらは同じ匿名型のインスタンスであり、それらのキー プロパティで一致する値を持つためです。 ただし、flight3 は、キー プロパティ FlightNo の値が異なるため、flight1 と等しくありません。 インスタンス flight4flight1 と同じ型ではありません。それらはキー プロパティと異なるプロパティを指定しているためです。

Dim flight2 = New With {Key .Airline = "Blue Yonder Airlines",
                        Key .FlightNo = 3554, .Gate = "D14"}
' The following statement displays True. The values of the non-key 
' property, Gate, do not have to be equal.
Console.WriteLine(flight1.Equals(flight2))

Dim flight3 = New With {Key .Airline = "Blue Yonder Airlines",
                        Key .FlightNo = 431, .Gate = "C33"}
' The following statement displays False, because flight3 has a
' different value for key property FlightNo.
Console.WriteLine(flight1.Equals(flight3))

Dim flight4 = New With {Key .Airline = "Blue Yonder Airlines",
                        .FlightNo = 3554, .Gate = "C33"}
' The following statement displays False. Instance flight4 is not the 
' same type as flight1 because they have different key properties. 
' FlightNo is a key property of flight1 but not of flight4.
Console.WriteLine(flight1.Equals(flight4))

2 つのインスタンスが、名前、型、順序、および値が同じで、非キー プロパティのみで宣言されている場合、2 つのインスタンスは等しくありません。 キー プロパティを持たないインスタンスは、それ自体とのみ等しくなります。

2 つの匿名型インスタンスが同じ匿名型のインスタンスである条件の詳細については、「匿名型」を参照してください。

ハッシュ コード計算

Equals と同様に、匿名型の GetHashCode に定義されているハッシュ関数は、型のキー プロパティに基づきます。 次の例に、キー プロパティとハッシュ コード値の間の相互作用を示します。

すべてのキー プロパティに同じ値を持つ匿名型のインスタンスは、同じハッシュ コード値を持ちます。非キー プロパティに一致する値がない場合でも同じです。 次のステートメントでは、True が返されます。

Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)

1 つ以上のキー プロパティで異なる値を持つ匿名型のインスタンスは、異なるハッシュ コード値を持ちます。 次のステートメントでは、False が返されます。

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

キー プロパティと異なるプロパティを指定する匿名型のインスタンスは、同じ型のインスタンスではありません。 それらは、すべてのプロパティの名前と値が同じであっても、異なるハッシュ コード値を持ちます。 次のステートメントでは、False が返されます。

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

読み取り専用の値

キー プロパティの値は変更できません。 たとえば、前の例の flight1 では、Airline フィールドと FlightNo フィールドは読み取り専用ですが、Gate は変更できます。

' The following statement will not compile, because FlightNo is a key
' property and cannot be changed.
' flight1.FlightNo = 1234
'
' Gate is not a key property. Its value can be changed.
flight1.Gate = "C5"

関連項目