Share via


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 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 onderdrukkingen bieden de volgende functionaliteit:

  • Equals retourneert True 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 geretourneerd True voor employee01 en employee08. De opmerking voor elke regel geeft de reden aan waarom het nieuwe exemplaar niet overeenkomt 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 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.GetHashCodeof .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.

Zie ook