Key
キーワードを使用すると、匿名型のプロパティの動作を指定できます。 キー プロパティとして指定したプロパティのみが、匿名型インスタンス間の等価性のテスト、またはハッシュ コード値の計算に参加します。 キー プロパティの値は変更できません。
匿名型のプロパティをキー プロパティとして指定するには、初期化リストの宣言の前にキーワード Key
を配置します。 次の例では、 Airline
と FlightNo
は重要なプロパティですが、 Gate
ではありません。
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
新しい匿名型が作成されると、 Objectから直接継承されます。 コンパイラは、継承された 3 つのメンバー ( Equals、 GetHashCode、および ToString) をオーバーライドします。 EqualsおよびGetHashCodeに対して生成されるオーバーライド コードは、キー プロパティに基づいています。 型にキー プロパティがない場合、 GetHashCode と Equals はオーバーライドされません。
平等
2 つの匿名型インスタンスは、同じ型のインスタンスであり、キー プロパティの値が等しい場合は等しくなります。 次の例では、 flight2
は前の例の flight1
と同じです。これは、同じ匿名型のインスタンスであり、キー プロパティの値が一致しているためです。 ただし、キー プロパティFlightNo
の値が異なるため、flight3
はflight1
と等しくありません。 インスタンス flight4
は、キー プロパティとして異なるプロパティを指定するため、 flight1
と同じ型ではありません。
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"
こちらも参照ください
.NET