Share via


Key (Visual Basic)

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

為匿名型別指定索引鍵屬性的方法,是在初始設定清單中於屬性的宣告前面加上 Key 關鍵字。 在下列範例中,Airline 和 FlightNo 是索引鍵屬性,Gate 則不是。

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

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

相等

如果兩個匿名型別執行個體 (Instance) 屬於相同型別,而且索引鍵屬性的值也相同,則這兩個執行個體便相等。 在下列範例中,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))

如果兩個執行個體只宣告非索引鍵屬性,但名稱、型別、順序和值都相等,則這兩個執行個體還是不相等。 沒有索引鍵屬性的執行個體只會與自己相等。

如需在何種條件下,兩個匿名型別的執行個體會是相同匿名型別之執行個體的詳細資訊,請參閱匿名型別 (Visual Basic)

計算雜湊程式碼

如同 Equals,定義於 GetHashCode 中的匿名型別雜湊函數,是以型別的索引鍵屬性為基礎。 在下列範例中,顯示了在索引鍵屬性和雜湊程式碼值間的互動。

所有索引鍵屬性值都相同之匿名型別的執行個體,就算非索引鍵屬性的值不相符,仍會有同樣的雜湊程式碼值。 下列陳述式會傳回 True。

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

有一個或多個索引鍵屬性值不同之匿名型別的執行個體,會有不一樣的雜湊程式碼值。 下列陳述式會傳回 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"

請參閱

工作

HOW TO:在匿名型別宣告中推斷屬性名稱和型別 (Visual Basic)

HOW TO:宣告匿名型別的執行個體 (Visual Basic)

概念

匿名型別定義 (Visual Basic)

匿名型別 (Visual Basic)