Anonieme typedefinitie (Visual Basic)
Als reactie op de declaratie van een exemplaar van een anoniem type, maakt de compiler een nieuwe klassedefinitie die de opgegeven eigenschappen voor het type bevat.
Door compiler gegenereerde code
Voor de volgende definitie maakt product
de compiler een nieuwe klassedefinitie die eigenschappen Name
bevat, Price
en OnHand
.
' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}
De klassedefinitie bevat eigenschapsdefinities die vergelijkbaar zijn met de volgende. U ziet dat er geen Set
methode is voor de sleuteleigenschappen. De waarden van sleuteleigenschappen zijn alleen-lezen.
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
Daarnaast bevatten anonieme typedefinities een parameterloze constructor. Constructors waarvoor parameters zijn vereist, zijn niet toegestaan.
Als een declaratie van een anoniem type ten minste één sleuteleigenschap bevat, overschrijft de typedefinitie drie leden die zijn overgenomen van Object: Equals, GetHashCodeen ToString. Als er geen sleuteleigenschappen worden gedeclareerd, wordt alleen ToString overschreven. De onderdrukkingen bieden de volgende functionaliteit:
Equals
retourneertTrue
als twee anonieme exemplaren hetzelfde exemplaar zijn of als ze voldoen aan de volgende voorwaarden:Ze hebben hetzelfde aantal eigenschappen.
De eigenschappen worden in dezelfde volgorde gedeclareerd, met dezelfde namen en dezelfde afgeleide typen. Naamvergelijkingen zijn niet hoofdlettergevoelig.
Ten minste één van de eigenschappen is een sleuteleigenschap en het
Key
trefwoord wordt toegepast op dezelfde eigenschappen.Vergelijking van elk overeenkomend paar sleuteleigenschappen retourneert
True
.In de volgende voorbeelden
Equals
wordt bijvoorbeeld alleen geretourneerdTrue
vooremployee01
enemployee08
. De opmerking voor elke regel geeft de reden aan waarom het nieuwe exemplaar niet overeenkomtemployee01
.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
biedt een correct uniek GetHashCode-algoritme. Het algoritme gebruikt alleen de sleuteleigenschappen om de hash-code te berekenen.ToString
retourneert een tekenreeks met samengevoegde eigenschapswaarden, zoals wordt weergegeven in het volgende voorbeeld. Zowel sleutel- als niet-sleuteleigenschappen zijn opgenomen.Console.WriteLine(employee01.ToString()) Console.WriteLine(employee01) ' The preceding statements both display the following: ' { Name = Bob, Category = 3, InOffice = False }
Expliciet benoemde eigenschappen van een anoniem type kunnen niet conflicteren met deze gegenereerde methoden. Dat wil gezegd, u kunt een eigenschap niet gebruiken .Equals
.GetHashCode
of .ToString
een naam geven.
Anonieme typedefinities die ten minste één sleuteleigenschap bevatten, implementeren ook de System.IEquatable<T> interface, waarbij T
het type van het anonieme type is.
Notitie
Anonieme typedeclaraties maken hetzelfde anonieme type alleen als ze voorkomen in dezelfde assembly, hun eigenschappen hebben dezelfde namen en dezelfde afgeleide typen, de eigenschappen worden gedeclareerd in dezelfde volgorde en dezelfde eigenschappen worden gemarkeerd als sleuteleigenschappen.