Definicja typu anonimowego (Visual Basic)
W odpowiedzi na deklarację wystąpienia typu anonimowego kompilator tworzy nową definicję klasy, która zawiera określone właściwości dla typu.
Kod wygenerowany przez kompilator
W przypadku poniższej product
definicji kompilator tworzy nową definicję klasy zawierającą właściwości Name
, Price
i OnHand
.
' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}
Definicja klasy zawiera definicje właściwości podobne do poniższych. Zwróć uwagę, że nie ma Set
metody dla właściwości klucza. Wartości właściwości klucza są tylko do odczytu.
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
Ponadto anonimowe definicje typów zawierają konstruktor bez parametrów. Konstruktory, które wymagają parametrów, nie są dozwolone.
Jeśli deklaracja typu anonimowego zawiera co najmniej jedną właściwość klucza, definicja typu zastępuje trzy elementy członkowskie dziedziczone z Object: Equals, GetHashCodei ToString. Jeśli nie zadeklarowane są żadne właściwości klucza, tylko ToString zostanie zastąpiona. Przesłonięcia zapewniają następujące funkcje:
Equals
ZwracaTrue
wartość , jeśli dwa wystąpienia typu anonimowego są tym samym wystąpieniem lub jeśli spełniają następujące warunki:Mają one taką samą liczbę właściwości.
Właściwości są deklarowane w tej samej kolejności, z tymi samymi nazwami i tymi samymi typami wnioskowanymi. Porównania nazw nie są uwzględniane wielkości liter.
Co najmniej jedna z właściwości jest właściwością klucza, a
Key
słowo kluczowe jest stosowane do tych samych właściwości.Porównanie każdej odpowiadającej pary właściwości klucza zwraca wartość
True
.Na przykład w poniższych przykładach
Equals
zwracane sąTrue
tylko wartości iemployee01
employee08
. Komentarz przed każdym wierszem określa przyczynę, dla którego nowe wystąpienie nie jest zgodneemployee01
.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
zapewnia odpowiednio unikatowy algorytm GetHashCode. Algorytm używa tylko właściwości klucza do obliczenia kodu skrótu.ToString
Zwraca ciąg połączonych wartości właściwości, jak pokazano w poniższym przykładzie. Uwzględniane są zarówno właściwości klucza, jak i innego niż klucz.Console.WriteLine(employee01.ToString()) Console.WriteLine(employee01) ' The preceding statements both display the following: ' { Name = Bob, Category = 3, InOffice = False }
Jawnie nazwane właściwości typu anonimowego nie mogą powodować konfliktu z tymi wygenerowanymi metodami. Oznacza to, że nie można nazwać właściwości za pomocą .Equals
metody , .GetHashCode
ani .ToString
.
Definicje typów anonimowych, które zawierają co najmniej jedną właściwość klucza, implementują System.IEquatable<T> również interfejs, gdzie T
jest typem typu anonimowego.
Uwaga
Deklaracje typów anonimowych tworzą ten sam typ anonimowy tylko wtedy, gdy wystąpią w tym samym zestawie, ich właściwości mają takie same nazwy i te same typy wnioskowane, właściwości są deklarowane w tej samej kolejności, a te same właściwości są oznaczone jako właściwości klucza.