Benannte Typen im Vergleich zu anonymen Typen

Aktualisiert: November 2007

Das Format, das Sie verwenden, um eine Instanz eines anonymen Typs zu deklarieren, ähnelt dem Format, das Sie verwenden, wenn Sie eine Instanz eines benannten Typs mit einem Objektinitialisierer deklarieren. Im Ergebnis gibt es jedoch wichtige Unterschiede.

Deklarationen

In den folgenden Beispielen ist product1 eine Instanz eines anonymen Typs und product2 eine Instanz der Product-Klasse. In beiden Deklarationen wird eine Initialisierungsliste verwendet. Der einzige syntaktische Unterschied zwischen den beiden Deklarationen besteht darin, dass für product1 nach New kein Datentyp angegeben wird. Dadurch wird dieser Typ zu einem anonymen Typ.

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

Die Variable product1 ist als Instanz eines anonymen Typs stark typisiert. Der Compiler definiert den Typ mit den Eigenschaften, die Sie in der Deklaration angeben. Der Compiler verwendet Lokaler Typrückschluss, um die Datentypen der Eigenschaften aus den von Ihnen angegebenen Anfangswerten zu ermitteln. In diesem Beispiel enthält der anonyme Typ die Eigenschaften Name und Price, deren Typen zu String bzw. Double abgeleitet werden.

Hinweis:

Im vorherigen Beispiel werden keine Eigenschaften als Schlüsseleigenschaften angegeben. Daher spielen die Eigenschaften keine Rolle beim Ermitteln, ob zwei Instanzen desselben Typs gleich sind oder welchen Hashcodewert die Instanz hat. Jedoch können die Werte der Eigenschaften geändert werden. Die Werte von Schlüsseleigenschaften sind dagegen schreibgeschützt. Weitere Informationen zu Schlüsseleigenschaften finden Sie unter Anonyme Typen.

Im folgenden Beispiel ist product2 als Instanz der Product-Klasse stark typisiert. Sowohl Name als auch Price müssen Member der Product-Klasse sein, und ihre Typen müssen kompatibel mit den in der Deklaration angegebenen Werten sein.

' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}

Weitere Informationen finden Sie unter Objektinitialisierer: Benannte und anonyme Typen.

Unterscheidungen

In der folgenden Liste werden weitere Aspekte der beiden Deklarationen verglichen:

  • Durch lokalen Typrückschluss wird ermittelt, dass product1 eine Instanz eines anonymen Typs und product2 eine Instanz der Product-Klasse ist. In beiden Deklarationen ist keine As-Klausel vorhanden, obwohl die As-Klausel für product2 optional ist.

    • Da für anonyme Typen keine Namen angegeben werden, können Sie keine As-Klausel verwenden, um product1 zu deklarieren. Der Typ muss abgeleitet werden. Dadurch wird die Verwendung von anonymen Typen auf lokale Variablen beschränkt.

    • Da product2 eine Instanz des benannten Typs Product ist, können Sie ihn mit einer As-Klausel deklarieren, ohne den Typ abzuleiten.

      Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
      
  • Wenn in Product ein geeigneter Konstruktor definiert ist, kann product2 deklariert und initialisiert werden, ohne einen Objektinitialisierer zu verwenden.

    Dim product2b As New Product("paperclips", 1.29)
    

    Alternativ hat die folgende Reihe von Anweisungen denselben Effekt.

    Dim product2c As New Product
    product2c.Name = "paperclips"
    product2c.Price = 1.29
    

    Für product1 sind keine ähnlichen Deklarationen möglich, da die Eigenschaften benannt und in der Initialisiererliste selbst definiert sind.

  • Da product1, product2 und die zugehörigen Eigenschaften stark typisiert sind, können Sie IntelliSense verwenden, um durch den Code zu navigieren, der diese Objekte verwendet.

    Vorsicht:

    Der Name des anonymen Typs wird vom Compiler erzeugt und kann von Kompilierung zu Kompilierung variieren. Sie sollten im Code den Namen eines anonymen Typs nicht verwenden oder sich darauf verlassen, da er sich bei einer Neukompilierung des Projekts ändern könnte.

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

Lokaler Typrückschluss

Referenz

Key (Visual Basic)