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"