使用 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
它与键属性FlightNo
具有不同的值而不相等flight1
。 实例 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
前面的示例中,字段是FlightNo
只读的Airline
,但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"