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.
Mithilfe von Objektinitialisierern können Sie Eigenschaften für ein komplexes Objekt mithilfe eines einzelnen Ausdrucks angeben. Sie können verwendet werden, um Instanzen benannter Typen und anonymer Typen zu erstellen.
Deklarationen
Deklarationen von Instanzen von benannten und anonymen Typen können fast identisch aussehen, aber ihre Auswirkungen sind nicht identisch. Jede Kategorie verfügt über eigene Fähigkeiten und Einschränkungen. Das folgende Beispiel zeigt eine bequeme Möglichkeit zum Deklarieren und Initialisieren einer Instanz einer benannten Klasse Customer
mithilfe einer Objektinitialisierungsliste. Beachten Sie, dass der Name der Klasse nach dem Schlüsselwort New
angegeben wird.
Dim namedCust = New Customer With {.Name = "Terry Adams"}
Ein anonymer Typ hat keinen verwendbaren Namen. Daher kann eine Instanziierung eines anonymen Typs keinen Klassennamen enthalten.
Dim anonymousCust = New With {.Name = "Hugo Garcia"}
Die Anforderungen und Ergebnisse der beiden Deklarationen sind nicht identisch. Für namedCust
muss bereits eine Customer
-Klasse existieren, die eine Name
-Eigenschaft hat, und die Deklaration erstellt eine Instanz dieser Klasse. Für anonymousCust
definiert der Compiler eine neue Klasse, die eine Eigenschaft hat, einen String namens Name
, und erstellt eine neue Instanz dieser Klasse.
Benannte Typen
Objektinitialisierer bieten eine einfache Möglichkeit, den Konstruktor eines Typs aufzurufen und dann die Werte einiger oder aller Eigenschaften in einer einzelnen Anweisung festzulegen. Der Compiler ruft den entsprechenden Konstruktor für die Anweisung auf: der parameterlose Konstruktor, wenn keine Argumente angezeigt werden, oder ein parametrisierter Konstruktor, wenn mindestens ein Argument gesendet wird. Danach werden die angegebenen Eigenschaften in der Reihenfolge initialisiert, in der sie in der Initialisierungsliste angezeigt werden.
Jede Initialisierung in der Initialisierungsliste besteht aus der Zuordnung eines Anfangswerts zu einem Element der Klasse. Die Namen und Datentypen der Member werden bestimmt, wenn die Klasse definiert ist. In den folgenden Beispielen muss die Customer
-Klasse vorhanden sein und Mitglieder namens Name
und City
haben, die Zeichenfolgen akzeptieren können.
Dim cust0 As Customer = New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Alternativ können Sie dasselbe Ergebnis mit dem folgenden Code abrufen:
Dim cust1 As New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Jede dieser Deklarationen entspricht dem folgenden Beispiel, das ein Customer
Objekt mithilfe des parameterlosen Konstruktors erstellt und dann die Anfangswerte für die Name
und City
die Eigenschaften mithilfe einer With
Anweisung angibt.
Dim cust2 As New Customer()
With cust2
.Name = "Toni Poe"
.City = "Louisville"
End With
Wenn die Customer
Klasse einen parametrisierten Konstruktor enthält, mit dem Sie z. B. einen Wert Name
senden können, können Sie ein Customer
Objekt auch auf folgende Weise deklarieren und initialisieren:
Dim cust3 As Customer =
New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}
Sie müssen nicht alle Eigenschaften initialisieren, wie der folgende Code zeigt.
Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}
Die Initialisierungsliste kann jedoch nicht leer sein. Nicht initialisierte Eigenschaften behalten ihre Standardwerte bei.
Typrückschluss mit benannten Typen
Sie können den Code für die Deklaration von cust1
kürzen, indem Sie Objektinitialisierer und lokale Typinferenz kombinieren. Auf diese Weise können Sie die As
Klausel in der Variablendeklaration weglassen. Der Datentyp der Variablen wird vom Typ des Objekts abgeleitet, das von der Zuordnung erstellt wird. Im folgenden Beispiel ist der Typ von cust6
Customer
.
Dim cust6 = New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Hinweise zu benannten Typen
Ein Klassenmember kann nicht mehrmals in der Objektinitialisiererliste initialisiert werden. Die Deklaration von
cust7
verursacht einen Fehler.'' This code does not compile because Name is initialized twice. ' Dim cust7 = New Customer With {.Name = "Toni Poe", ' .City = "Louisville", ' .Name = "Blue Yonder Airlines"}
Ein Member kann verwendet werden, um sich selbst oder ein anderes Feld zu initialisieren. Wenn auf ein Element zugegriffen wird, bevor es initialisiert wurde, wie in der folgenden Deklaration für
cust8
, wird der Standardwert verwendet. Denken Sie daran, dass beim Verarbeiten einer Deklaration, die einen Objektinitialisierer verwendet, zunächst der entsprechende Konstruktor aufgerufen wird. Danach werden die einzelnen Felder in der Initialisierungsliste initialisiert. In den folgenden Beispielen wird der Standardwert vonName
aufcust8
zugewiesen, und ein initialisierter Wert wird incust9
zugewiesen.Dim cust8 = New Customer With {.Name = .Name & ", President"} Dim cust9 = New Customer With {.Name = "Toni Poe", .Title = .Name & ", President"}
Im folgenden Beispiel wird der parametrisierte Konstruktor aus
cust3
undcust4
verwendet, umcust10
undcust11
zu deklarieren und zu initialisieren.Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"} ' --or-- Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
Objektinitialisierer können geschachtelt werden. Im folgenden Beispiel ist
AddressClass
eine Klasse, die zwei Eigenschaften,City
undState
, hat, und die KlasseCustomer
verfügt über eine EigenschaftAddress
, die eine Instanz vonAddressClass
ist.Dim cust12 = New Customer With {.Name = "Toni Poe", .Address = New AddressClass With {.City = "Louisville", .State = "Kentucky"}} Console.WriteLine(cust12.Address.State)
Die Initialisierungsliste darf nicht leer sein.
Die initialisierte Instanz darf nicht vom Typ "Object" sein.
Klassenmember, die initialisiert werden, dürfen nicht freigegebene Member, schreibgeschützte Member, Konstanten oder Methodenaufrufe sein.
Klassenmember, die initialisiert werden, können nicht indiziert oder qualifiziert werden. Die folgenden Beispiele lösen Compilerfehler aus:
'' Not valid.
' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}
' Dim c2 = New Customer with {.Address.City = "Springfield"}
Anonyme Typen
Anonyme Typen verwenden Objektinitialisierer, um Instanzen neuer Typen zu erstellen, die Sie nicht explizit definieren und benennen. Stattdessen generiert der Compiler einen Typ gemäß den Eigenschaften, die Sie in der Objektinitialisierungsliste festlegen. Da der Name des Typs nicht angegeben ist, wird er als anonymer Typ bezeichnet. Vergleichen Sie beispielsweise die folgende Deklaration mit der früheren Deklaration für cust6
.
Dim cust13 = New With {.Name = "Toni Poe",
.City = "Louisville"}
Der einzige Unterschied in der Syntax ist, dass nach New
für den Datentyp kein Name angegeben wird. Was jedoch passiert, ist ganz anders. Der Compiler definiert einen neuen anonymen Typ mit zwei Eigenschaften Name
und City
erstellt eine Instanz davon mit den angegebenen Werten. Typinference bestimmt die Typen von Name
und City
im Beispiel als Zeichenfolgen.
Vorsicht
Der Name des anonymen Typs wird vom Compiler generiert und kann von Kompilierung zu Kompilierung variieren. Ihr Code sollte sich nicht auf den Namen eines anonymen Typs verlassen oder diesen verwenden.
Da der Name des Typs nicht verfügbar ist, können Sie keine As
Klausel zum Deklarieren cust13
verwenden. Der Typ muss abgeleitet werden. Ohne späte Bindung beschränkt dies die Verwendung anonymer Typen auf lokale Variablen.
Anonyme Typen bieten wichtige Unterstützung für LINQ-Abfragen. Weitere Informationen zur Verwendung anonymer Typen in Abfragen finden Sie unter "Anonyme Typen " und "Einführung in LINQ" in Visual Basic.
Hinweise zu anonymen Typen
In der Regel sind alle oder die meisten Eigenschaften in einer anonymen Typdeklaration wichtige Eigenschaften, die durch Eingabe des Schlüsselworts
Key
vor dem Eigenschaftennamen angegeben werden.Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", Key .City = "Louisville"}
Weitere Informationen zu schlüsseleigenschaften finden Sie unter "Key".
Wie benannte Typen müssen Initialisierungslisten für anonyme Typdefinitionen mindestens eine Eigenschaft deklarieren.
Dim anonymousCust = New With {.Name = "Hugo Garcia"}
Wenn eine Instanz eines anonymen Typs deklariert wird, generiert der Compiler eine übereinstimmende Definition für anonymen Typ. Die Namen und Datentypen der Eigenschaften stammen aus der Instanzdeklaration und werden vom Compiler in der Definition eingeschlossen. Die Eigenschaften werden nicht im Voraus benannt und definiert, wie es bei einem benannten Typ der Fall wäre. Ihre Typen werden abgeleitet. Sie können die Datentypen der Eigenschaften nicht mithilfe einer
As
Klausel angeben.Anonyme Typen können auch die Namen und Werte ihrer Eigenschaften auf verschiedene andere Weise festlegen. Beispielsweise kann eine anonyme Typeigenschaft sowohl den Namen als auch den Wert einer Variablen oder den Namen und den Wert einer Eigenschaft eines anderen Objekts verwenden.
' Create a variable, Name, and give it an initial value. Dim Name = "Hugo Garcia" ' Variable anonymousCust2 will have one property, Name, with ' "Hugo Garcia" as its initial value. Dim anonymousCust2 = New With {Key Name} ' The next declaration uses a property from namedCust, defined ' in an earlier example. After the declaration, anonymousCust3 will ' have one property, Name, with "Terry Adams" as its value. Dim anonymousCust3 = New With {Key namedCust.Name}
Weitere Informationen zu den Optionen zum Definieren von Eigenschaften in anonymen Typen finden Sie unter So ermitteln Sie Eigenschaftsnamen und -typen in Deklarationen anonymer Typen.