共用方式為


機碼 (Visual Basic)

Key關鍵詞可讓您指定匿名型別屬性的行為。 只有您指定為索引鍵屬性的屬性會參與匿名類型實例之間的相等測試,或哈希程式代碼值的計算。 無法變更索引鍵屬性的值。

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

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

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

平等

如果兩個匿名型別實例是相同類型的實例,以及其索引鍵屬性的值相等,則兩個匿名型別實例相等。 在下列範例中, flight2flight1 上一個範例相同,因為它們是相同匿名類型的實例,而且其索引鍵屬性具有相符的值。 不過,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))

如果兩個實例只以非索引鍵屬性宣告,則名稱、類型、順序和值相同,則兩個實例不相等。 沒有索引鍵屬性的實例只等於本身。

如需兩個匿名型別實例是相同匿名型別實例之條件的詳細資訊,請參閱 匿名型別。

哈希碼計算

如同 Equals,針對匿名型別所定義的 GetHashCode 哈希函式是以型別的索引鍵屬性為基礎。 下列範例顯示索引鍵屬性與哈希程式代碼值之間的互動。

所有索引鍵屬性具有相同值的匿名型別實例具有相同的哈希碼值,即使非索引鍵屬性沒有相符的值也一樣。 下列語句會傳 True回 。

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

針對一或多個索引鍵屬性具有不同值的匿名型別實例,有不同的哈希碼值。 下列語句會傳 False回 。

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

將不同屬性指定為索引鍵屬性的匿名型別實例不是相同類型的實例。 即使所有屬性的名稱和值都相同,它們也有不同的哈希碼值。 下列語句會傳 False回 。

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

Read-Only 值

無法變更索引鍵屬性的值。 例如,在 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"

另請參閱