Definition von anonymen Typen

Aktualisiert: November 2007

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

Vom Compiler generierter Code

Für die folgende Definition von product erzeugt der Compiler eine neue Klassendefinition, die die Eigenschaften Name, Price und OnHand enthä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, die den folgenden ähneln. Beachten Sie, dass keine Set-Methode für die Schlüsseleigenschaften vorhanden ist. Die Werte von Schlüsseleigenschaften sind schreibgeschützt.

Public Class $Anonymous1
    Private _name As String
    Private _price As Double
    Private _onHand As Integer
     Public Property Name() As String
        Get
            Return _name
        End Get
    End Property

    Public 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

Weiterhin enthalten Definitionen von anonymen Typen Standardkonstruktoren. Konstruktoren, die Parameter benötigen, sind nicht zulässig.

Wenn die Deklaration eines anonymen Typs mindestens eine Schlüsseleigenschaft enthält, überschreibt die Typdefinition drei von Object geerbte Member: Equals, GetHashCode und ToString. Wenn keine Schlüsseleigenschaften deklariert werden, wird nur ToString überschrieben. Die Überschreibungen stellen die folgenden Funktionen bereit:

  • Equals gibt True zurück, wenn zwei Instanzen von anonymen Typen gleich sind oder die folgenden Bedingungen erfüllen:

    • Sie haben die gleiche Anzahl von Eigenschaften.

    • Die Eigenschaften werden in der gleichen Reihenfolge mit denselben Namen und denselben abgeleiteten Typen deklariert. Beim Vergleichen von Namen wird die Groß- und Kleinschreibung nicht berücksichtigt.

    • Mindestens eine der Eigenschaften ist eine Schlüsseleigenschaft, und dieselben Eigenschaften sind durch das Key-Schlüsselwort ausgezeichnet.

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

    In den folgenden Beispielen gibt Equals nur für employee01 und employee08 den Wert True zurück. Der Kommentar vor jeder Zeile gibt den Grund an, aus dem die neue Instanz nicht gleich employee01 ist.

    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 ausreichend eindeutigen GetHashCode-Algorithmus bereit. Der Algorithmus verwendet zur Berechnung des Hashcodes nur die Schlüsseleigenschaften.

  • Wie im folgenden Beispiel gezeigt, gibt ToString eine Zeichenfolge verketteter Eigenschaftenwerte zurück. Sie enthält sowohl Schlüsseleigenschaften als auch Nicht-Schlüsseleigenschaften.

    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 dürfen keine Konflikte mit diesen erzeugten Methoden hervorrufen. Das heißt, Sie können .Equals, .GetHashCode oder .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:

Deklarationen von anonymen Typen erstellen nur dann denselben anonymen Typ, wenn sie sich in derselben Assembly befinden, ihre Eigenschaften dieselben Namen und dieselben abgeleiteten Typen haben, die Eigenschaften in derselben Reihenfolge deklariert werden und dieselben Eigenschaften als Schlüsseleigenschaften gekennzeichnet sind.

Siehe auch

Aufgaben

Gewusst wie: Deklarieren einer Instanz eines anonymen Typs

Gewusst wie: Ableiten von Eigenschaftennamen und Typen in Deklarationen von anonymen Typen

Konzepte

Anonyme Typen

Benannte Typen im Vergleich zu anonymen Typen