Key (Visual Basic)
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 は、同じ匿名型のインスタンスであり、キー プロパティの値が一致するので等価です。 ただし、flight3 と flight1 は等価ではありません。キー プロパティの FlightNo の値が異なるためです。 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 つの匿名型インスタンスが同じ匿名型のインスタンスである場合の条件については、「匿名型 (Visual Basic)」を参照してください。
ハッシュ コードの計算
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"
参照
処理手順
方法: 匿名型の宣言におけるプロパティ名と型を推論する (Visual Basic)