Key (Visual Basic)
使用 Key 关键字可以指定匿名类型的属性的行为。 仅有指定为键属性的属性可参与匿名类型实例之间的相等性测试或哈希代码值的计算。 主要属性的值是不能更改的。
可以将匿名类型的属性指定为键属性,方法是在初始化列表中将关键字 Key 放置在属性声明之前。 在下面的示例中,Airline 和 FlightNo 是键属性,但 Gate 不是。
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
当创建新的匿名类型时,它直接从 Object 继承。 编译器重写三个继承的成员:Equals、GetHashCode 和 ToString。 为 Equals 和 GetHashCode 生成的重写代码基于键属性。 如果类型没有任何键属性,则不重写 GetHashCode 和 Equals。
相等
两个匿名类型实例相等的条件是:它们是相同类型的实例,并且它们的键属性的值相等。 在以下示例中,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)