Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 Eigenschaftsdefinitionen ä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 von Object geerbte Mitglieder: Equals, GetHashCode und ToString. Wenn keine Schlüsseleigenschaften deklariert werden, wird nur ToString überschrieben. Elementdefinitionen bieten die folgenden Funktionen:
Equals
gibt zurückTrue
, wenn zwei anonyme Typinstanzen dieselbe Instanz sind oder wenn sie die folgenden Bedingungen erfüllen:Sie haben dieselbe Anzahl von Eigenschaften.
Die Eigenschaften werden in derselben Reihenfolge deklariert, mit denselben Namen und denselben abgeleiteten Typen. Bei Namensvergleichen wird die Groß-/Kleinschreibung nicht beachtet.
Mindestens eine der Eigenschaften ist eine Schlüsseleigenschaft, und das
Key
Schlüsselwort wird auf dieselben Eigenschaften angewendet.Der Vergleich jedes entsprechenden Paars von Schlüsseleigenschaften gibt
True
zurück.In den folgenden Beispielen gibt
Equals
beispielsweise nur fürTrue
undemployee01
employee08
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 wichtigsten Eigenschaften, 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
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
Anonyme Typdeklarationen erstellen denselben anonymen Typ nur, wenn sie in derselben Assembly auftreten, ihre Eigenschaften dieselben Namen und dieselben abgeleiteten Typen haben, die Eigenschaften werden in derselben Reihenfolge deklariert, und die gleichen Eigenschaften werden als Schlüsseleigenschaften markiert.