Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Ключевое 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 не переопределяются.
Равенство
Два анонимных экземпляра типа равны, если они являются экземплярами одного типа, и если значения их ключевых свойств равны. В следующих примерах равно 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)
значения Read-Only
Нельзя изменить значения ключевых свойств. Например, в 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"