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)