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))
如果仅用非键属性声明了两个实例,在名称、类型、顺序和值上相同,则这两个实例不相等。 没有键属性的实例仅等同于其自身。
有关这两个匿名类型实例是同一匿名类型的实例的详细信息,请参阅 匿名类型。
哈希代码计算
与 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"