Key (Visual Basic)
Key 關鍵字可讓您指定匿名型別之屬性的行為。 只有您指定為索引鍵屬性的屬性,將會用於匿名型別執行個體間的相等性測試,或用於計算雜湊程式碼值。 索引鍵屬性的值無法變更。
為匿名型別指定索引鍵屬性的方法,是在初始設定清單中於屬性的宣告前面加上 Key 關鍵字。 在下列範例中,Airline 和 FlightNo 是索引鍵屬性,Gate 則不是。
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
建立匿名型別時,匿名型別會直接繼承自 Object。 編譯器 (Compiler) 會覆寫三個繼承的成員:Equals、GetHashCode 和 ToString。 為 Equals 和 GetHashCode 產生的覆寫程式碼,是以索引鍵屬性為基礎。 如果型別中沒有索引鍵屬性,就不會覆寫 GetHashCode 和 Equals。
相等
如果兩個匿名型別執行個體 (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"
請參閱
工作
如何:在匿名類型宣告中推斷屬性名稱和類型 (Visual Basic)