Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
Compiler-Generated code
Voor de volgende definitie maakt productde compiler een nieuwe klassedefinitie die eigenschappen Namebevat, Priceen 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 overrides bieden de volgende functionaliteit:
EqualsretourneertTrueals 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
Keytrefwoord wordt toegepast op dezelfde eigenschappen.Vergelijking van elk overeenkomend paar sleuteleigenschappen retourneert
True.Bijvoorbeeld, in de volgende voorbeelden retourneert
EqualsalleenTruevooremployee01enemployee08. 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))
GetHashcodebiedt een correct uniek GetHashCode-algoritme. Het algoritme gebruikt alleen de sleuteleigenschappen om de hash-code te berekenen.ToStringretourneert 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 zeggen, u kunt niet .Equals, .GetHashCode of .ToString gebruiken om een eigenschap een naam te 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.
Opmerking
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.