Key (Visual Basic)

Key 關鍵字可讓您指定匿名型別屬性的行為。 只有您指定為 Key 屬性的屬性可參與匿名型別執行個體之間的相等測試,或雜湊碼值的計算。 您無法變更 Key 屬性的值。

您可以將匿名型別的屬性指定為 Key 屬性,方法是將關鍵字 Key 放在放在初始化清單中其宣告前面。 在下列範例中,AirlineFlightNo 是 Key 屬性,但 Gate 不是。

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

建立新的匿名型別時,它會直接繼承自 Object。 編譯器會覆寫三個繼承的成員:EqualsGetHashCodeToString。 針對 EqualsGetHashCode 產生的覆寫程式碼是以 Key 屬性為基礎。 如果類型中沒有 Key 屬性,即不會覆寫 GetHashCodeEquals

Equality

如果兩個匿名型別執行個體是相同類型的執行個體,且其 Key 屬性的值相等,則這兩個匿名型別執行個體相等。 在下列範例中,flight2 與上一個範例的 flight1 相等,因為它們是相同匿名型別的執行個體,而且其 Key 屬性具有相符的值。 不過,flight3 不等於 flight1,因為它的 Key 屬性值 FlightNo 不同。 執行個體 flight4 的類型與 flight1 不同,因為它們為 Key 屬性指定的屬性不同。

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))

如果兩個執行個體只以非 Key 屬性及相同名稱、類型、順序和值宣告,則這兩個執行個體不相等。 沒有 Key 屬性的執行個體只等於本身。

如需了解在哪些條件下兩個匿名型別執行個體為相同匿名型別執行個體的詳細資料,請參閱匿名型別

雜湊程式碼計算

如同 EqualsGetHashCode 中針對匿名型別所定義的雜湊函式是以型別的 Key 屬性為基礎。 下列範例顯示 Key 屬性與雜湊程式碼值之間的互動。

如果匿名型別執行個體的所有 Key 屬性具有相同值,則其雜湊碼值會相同,即使非 Key 屬性沒有相符的值也一樣。 下列陳述式會傳回 True

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

如果匿名型別執行個體的一或多個 Key 屬性具有不同值,則其雜湊碼值會不同。 下列陳述式會傳回 False

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

如果匿名型別執行個體將不同屬性指定為 Key 屬性,則其不是相同類型的執行個體。 即使所有屬性的名稱和值都相同,它們也有不同的雜湊碼值。 下列陳述式會傳回 False

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

唯讀值

您無法變更 Key 屬性的值。 例如,在先前範例的 flight1 中,AirlineFlightNo 欄位是唯讀的,但 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"

另請參閱