Поделиться через


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 основанный на ключевых свойствах. Если в типе нет ключевых свойств и GetHashCodeEquals не переопределяются.

Equality

Два анонимных экземпляра типа равны, если они являются экземплярами одного типа, и если значения их ключевых свойств равны. В следующих примерах равно flight1 предыдущему примеру, flight2 так как они являются экземплярами одного и того же анонимного типа и имеют соответствующие значения для их ключевых свойств. Однако не равноflight1, flight3 так как оно имеет другое значение для свойства ключа. 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"

См. также