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


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

В ответ на объявление экземпляра анонимного типа компилятор создает новое определение класса, содержащее указанные свойства для типа.

Созданный компилятором код

Для следующего productопределения компилятор создает новое определение класса, содержащее свойства Name, Priceи OnHand.

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}

Определение класса содержит определения свойств, аналогичные следующим. Обратите внимание, что для ключевых свойств нет Set метода. Значения ключевых свойств доступны только для чтения.

Public Class $Anonymous1
    Private _name As String
    Private _price As Double
    Private _onHand As Integer
     Public ReadOnly Property Name() As String
        Get
            Return _name
        End Get
    End Property

    Public ReadOnly Property Price() As Double
        Get
            Return _price
        End Get
    End Property

    Public Property OnHand() As Integer
        Get
            Return _onHand
        End Get
        Set(ByVal Value As Integer)
            _onHand = Value
        End Set
    End Property

End Class

Кроме того, определения анонимных типов содержат конструктор без параметров. Конструкторы, требующие параметров, не допускаются.

Если объявление анонимного типа содержит по крайней мере одно ключевое свойство, определение типа переопределяет три члена, унаследованные от Object: Equals, GetHashCodeи ToString. Если ключевые свойства не объявлены, переопределяется только ToString . Переопределения предоставляют следующие функции:

  • Equals возвращается True , если два анонимных экземпляра типа являются одинаковыми или соответствуют следующим условиям:

    • Они имеют одинаковое количество свойств.

    • Свойства объявляются в одном порядке с одинаковыми именами и теми же выводными типами. Сравнения имен не учитывает регистр.

    • По крайней мере одно из свойств является ключевым свойством, и Key ключевое слово применяется к тем же свойствам.

    • Сравнение каждой соответствующей пары ключевых свойств возвращается True.

      Например, в следующих примерах Equals возвращается True только для employee01 и employee08. Комментарий перед каждой строкой указывает причину, по которой новый экземпляр не соответствует employee01.

      Dim employee01 = New With {Key .Name = "Bob", Key .Category = 3, .InOffice = False}
      
      ' employee02 has no InOffice property.
      Dim employee02 = New With {Key .Name = "Bob", Key .Category = 3}
      
      ' The first property has a different name.
      Dim employee03 = New With {Key .FirstName = "Bob", Key .Category = 3, .InOffice = False}
      
      ' Property Category has a different value.
      Dim employee04 = New With {Key .Name = "Bob", Key .Category = 2, .InOffice = False}
      
      ' Property Category has a different type.
      Dim employee05 = New With {Key .Name = "Bob", Key .Category = 3.2, .InOffice = False}
      
      ' The properties are declared in a different order.
      Dim employee06 = New With {Key .Category = 3, Key .Name = "Bob", .InOffice = False}
      
      ' Property Category is not a key property.
      Dim employee07 = New With {Key .Name = "Bob", .Category = 3, .InOffice = False}
      
      ' employee01 and employee 08 meet all conditions for equality. Note 
      ' that the values of the non-key field need not be the same.
      Dim employee08 = New With {Key .Name = "Bob", Key .Category = 2 + 1, .InOffice = True}
      
      ' Equals returns True only for employee01 and employee08.
      Console.WriteLine(employee01.Equals(employee08))
      
  • GetHashcode предоставляет соответствующий уникальный алгоритм GetHashCode. Алгоритм использует только ключевые свойства для вычисления хэш-кода.

  • ToString возвращает строку сцепленных значений свойств, как показано в следующем примере. Включены оба свойства ключей и неключевых ключей.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

Явно именованные свойства анонимного типа не могут конфликтовировать с этими созданными методами. Т. е. нельзя использовать .Equals.GetHashCodeили .ToString именовать свойство.

Определения анонимных типов, которые включают по крайней мере одно свойство ключа, также реализуют System.IEquatable<T> интерфейс, где T тип анонимного типа.

Примечание.

Объявления анонимных типов создают тот же анонимный тип, только если они происходят в той же сборке, их свойства имеют одинаковые имена и те же выводные типы, свойства объявляются в том же порядке, а те же свойства помечены как ключевые свойства.

См. также