Определение анонимного типа (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 для имени свойства.
Определения анонимных типов, которые включают по крайней мере одно ключевое свойство, также реализуют интерфейс IEquatable, где T — тип анонимного типа.
Примечание
Объявления анонимного типа создают тот же анонимный тип, только если они встречаются в той же сборке, их свойства имеют те же имена и те же выводимые типы, свойства объявлены в том же порядке, и те же свойства маркированы как ключевые свойства.