Definition von anonymen Typen (Visual Basic)

Als Reaktion auf die Deklaration einer Instanz eines anonymen Typs erstellt der Compiler eine neue Klassendefinition, die die angegebenen Eigenschaften für den Typ enthält.

Vom Compiler generierter Code

Für die folgende Definition von product erstellt der Compiler eine neue Klassendefinition, die die Eigenschaften Name, Priceund OnHandenthält.

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}

Die Klassendefinition enthält Eigenschaftendefinitionen ähnlich der folgenden. Beachten Sie, dass es keine Set-Methode für die Schlüsseleigenschaften gibt. Die Werte der Schlüsseleigenschaften sind schreibgeschützt.

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

Darüber hinaus enthalten anonyme Typdefinitionen einen parameterlosen Konstruktor. Konstruktoren, die Parameter erfordern, sind nicht zulässig.

Wenn eine anonyme Typdeklaration mindestens eine Schlüsseleigenschaft enthält, überschreibt die Typdefinition drei Member, die von Object geerbt werden: Equals, GetHashCodeund ToString. Wenn keine Schlüsseleigenschaften deklariert werden, wird nur ToString überschrieben. Elementdefinitionen bieten die folgenden Funktionen:

  • Equals gibt True zurück, wenn zwei anonyme Typinstanzen die gleiche Instanz sind oder wenn sie die folgenden Bedingungen erfüllen:

    • Sie verfügen über die gleiche Anzahl von Eigenschaften.

    • Die Eigenschaften werden in der gleichen Reihenfolge mit denselben Namen und denselben abgeleiteten Typen deklariert. Bei Namensvergleichen wird die Groß-/Kleinschreibung nicht beachtet.

    • Mindestens eine der Eigenschaften ist eine Schlüsseleigenschaft und das Key-Schlüsselwort wird auf die gleichen Eigenschaften angewendet.

    • Der Vergleich jedes entsprechenden Paars von Schlüsseleigenschaften gibt True zurück.

      In den folgenden Beispielen gibt Equals beispielsweise nur für employee01 und employee08True zurück. Der Kommentar vor jeder Zeile gibt den Grund an, warum die neue Instanz nicht mit employee01 übereinstimmt.

      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 stellt einen entsprechend eindeutigen GetHashCode-Algorithmus bereit. Der Algorithmus verwendet nur die Schlüsseleigenschaften, um den Hashcode zu berechnen.

  • ToString gibt eine Zeichenfolge mit verketteten Eigenschaftswerten zurück, wie im folgenden Beispiel gezeigt. Sowohl Schlüssel- als auch Nicht-Schlüsseleigenschaften sind enthalten.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

Explizit benannte Eigenschaften eines anonymen Typs können nicht mit diesen generierten Methoden in Konflikt geraten. Das heißt, Sie können .Equals.GetHashCode und .ToString nicht verwenden, um eine Eigenschaft zu benennen.

Anonyme Typdefinitionen, die mindestens eine Schlüsseleigenschaft enthalten, implementieren auch die System.IEquatable<T>-Schnittstelle, wobei T der Typ des anonymen Typs ist.

Hinweis

Anonyme Typdeklarationen erstellen den gleichen anonymen Typ nur, wenn sie im selben Assembly vorkommen, ihre Eigenschaften dieselben Namen und die gleichen abgeleiteten Typen haben, die Eigenschaften in derselben Reihenfolge deklariert werden und dieselben Eigenschaften als Schlüsseleigenschaften gekennzeichnet sind.

Siehe auch