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


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)

Основные понятия

Определение анонимного типа (Visual Basic)

Анонимные типы (Visual Basic)