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
, 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 ä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
gibtTrue
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üremployee01
undemployee08
True
zurück. Der Kommentar vor jeder Zeile gibt den Grund an, warum die neue Instanz nicht mitemployee01
ü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.