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"