Anonyme Typen (Visual Basic)Anonymous Types (Visual Basic)

Visual Basic unterstützt anonyme Typen, die Ihnen ermöglichen, Objekte zu erstellen, ohne eine Klassendefinition für den Datentyp zu schreiben.Visual Basic supports anonymous types, which enable you to create objects without writing a class definition for the data type. Stattdessen erzeugt der Compiler eine Klasse.Instead, the compiler generates a class for you. Die Klasse hat keinen verwendbaren Namen, erbt direkt von Object, und enthält die Eigenschaften, die Sie in der Deklaration des Objekts angeben.The class has no usable name, inherits directly from Object, and contains the properties you specify in declaring the object. Da der Name des Datentyps nicht angegeben ist, wird bezeichnet als ein anonymen Typ.Because the name of the data type is not specified, it is referred to as an anonymous type.

Im folgende Beispiel Variable deklariert und erstellt product als eine Instanz eines anonymen Typs, das zwei Eigenschaften Name und Price.The following example declares and creates variable product as an instance of an anonymous type that has two properties, Name and Price.

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

Ein -Abfrageausdruck anonyme Typen verwendet, um Spalten mit Daten ausgewählt, die von einer Abfrage zu kombinieren.A query expression uses anonymous types to combine columns of data selected by a query. Den Typ des Ergebnisses kann nicht im Voraus definiert werden, da die Spalten jedoch nicht vorhersehbar ist, die eine bestimmte Abfrage auswählen kann.You cannot define the type of the result in advance, because you cannot predict the columns a particular query might select. Anonyme Typen können Sie eine Abfrage schreiben, die eine beliebige Anzahl von Spalten, in beliebiger Reihenfolge auswählt.Anonymous types enable you to write a query that selects any number of columns, in any order. Der Compiler erstellt einen Datentyp, der die angegebenen Eigenschaften und der angegebenen Reihenfolge entspricht.The compiler creates a data type that matches the specified properties and the specified order.

In den folgenden Beispielen products ist eine Liste von Product-Objekte, von denen jedes über viele Eigenschaften verfügt.In the following examples, products is a list of product objects, each of which has many properties. Variable namePriceQuery enthält die Definition einer Abfrage, die bei der Ausführung, eine Auflistung von Instanzen eines anonymen Typs zurückgibt, das zwei Eigenschaften Name und Price.Variable namePriceQuery holds the definition of a query that, when it is executed, returns a collection of instances of an anonymous type that has two properties, Name and Price.

Dim namePriceQuery = From prod In products
                     Select prod.Name, prod.Price

Variable nameQuantityQuery enthält die Definition einer Abfrage, die bei der Ausführung, eine Auflistung von Instanzen eines anonymen Typs zurückgibt, das zwei Eigenschaften Name und OnHand.Variable nameQuantityQuery holds the definition of a query that, when it is executed, returns a collection of instances of an anonymous type that has two properties, Name and OnHand.

Dim nameQuantityQuery = From prod In products
                        Select prod.Name, prod.OnHand

Weitere Informationen zu den Code, der vom Compiler für einen anonymen Typ erstellt wird, finden Sie unter anonymen Typdefinition.For more information about the code created by the compiler for an anonymous type, see Anonymous Type Definition.

Achtung

Der Name des anonymen Typs ist Compiler generiert und kann von Kompilierungen variieren.The name of the anonymous type is compiler generated and may vary from compilation to compilation. Der Code sollte nicht verwenden oder basieren auf den Namen eines anonymen Typs, da Sie der Namen ändern kann, wenn ein Projekt erneut kompiliert wird.Your code should not use or rely on the name of an anonymous type because the name might change when a project is recompiled.

Deklaration eines anonymen TypsDeclaring an Anonymous Type

Die Deklaration einer Instanz eines anonymen Typs wird mit einer Initialisiererliste die Eigenschaften des Typs angegeben.The declaration of an instance of an anonymous type uses an initializer list to specify the properties of the type. Sie können nur Eigenschaften angeben, wenn Sie einen anonymen Typ, der keine anderen Klassenelemente wie Methoden oder Ereignisse deklarieren.You can specify only properties when you declare an anonymous type, not other class elements such as methods or events. Im folgenden Beispiel product1 ist eine Instanz eines anonymen Typs, die über zwei Eigenschaften verfügt: Name und Price.In the following example, product1 is an instance of an anonymous type that has two properties: Name and Price.

' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}

Wenn Sie Eigenschaften als Schlüsseleigenschaften festlegen, können sie Sie zwei anonymen Typs-Instanzen auf Gleichheit verglichen werden soll.If you designate properties as key properties, you can use them to compare two anonymous type instances for equality. Allerdings können die Werte der Eigenschaften geändert werden.However, the values of key properties cannot be changed. Siehe Abschnitt Schlüsseleigenschaften weiter unten in diesem Thema für Weitere Informationen.See the Key Properties section later in this topic for more information.

Beachten Sie, dass eine Instanz eines anonymen Typs deklarieren z. B. eine Instanz eines benannten Typs mithilfe eines Objektinitialisierers deklarieren:Notice that declaring an instance of an anonymous type is like declaring an instance of a named type by using an object initializer:

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

Weitere Informationen zu anderen Möglichkeiten zum Angeben von Eigenschaften des anonymen Typs, finden Sie unter wie: Ableiten von Eigenschaftennamen und Typen in Deklarationen von anonymen Typen.For more information about other ways to specify anonymous type properties, see How to: Infer Property Names and Types in Anonymous Type Declarations.

Wichtige EigenschaftenKey Properties

Wichtige Eigenschaften unterscheiden sich einige grundlegende Arten von nicht schlüsselbezogene Eigenschaften:Key properties differ from non-key properties in several fundamental ways:

  • Um zu bestimmen, ob zwei Instanzen gleich sind, werden nur die Werte von Schlüsseleigenschaften verglichen.Only the values of key properties are compared in order to determine whether two instances are equal.

  • Die Werte der Eigenschaften sind schreibgeschützt und können nicht geändert werden.The values of key properties are read-only and cannot be changed.

  • Eigenschaftenwerte sind nur in der vom Compiler generierte Code Hashalgorithmus für einen anonymen Typ enthalten.Only key property values are included in the compiler-generated hash code algorithm for an anonymous type.

GleichheitEquality

Instanzen von anonymen Typen können nur dann, wenn sie Instanzen desselben anonymen Typs sind gleich sein.Instances of anonymous types can be equal only if they are instances of the same anonymous type. Der Compiler behandelt zwei Instanzen als Instanzen desselben Typs, wenn sie die folgenden Bedingungen erfüllen:The compiler treats two instances as instances of the same type if they meet the following conditions:

  • In der gleichen Assembly deklariert werden.They are declared in the same assembly.

  • Ihre Eigenschaften haben die gleichen Namen, die gleichen hergeleiteten Typen, und in der gleichen Reihenfolge deklariert werden.Their properties have the same names, the same inferred types, and are declared in the same order. Vergleichen des wird die Groß-und Kleinschreibung nicht berücksichtigt.Name comparisons are not case-sensitive.

  • Die gleichen Eigenschaften in den einzelnen sind als Schlüsseleigenschaften gekennzeichnet.The same properties in each are marked as key properties.

  • Mindestens eine Eigenschaft in jeder Deklaration ist eine Schlüsseleigenschaft.At least one property in each declaration is a key property.

Eine Instanz eines anonymen Typs, die keine Schlüsseleigenschaften verfügt ist ungleich sich selbst.An instance of an anonymous types that has no key properties is equal only to itself.

' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}

' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))

' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))

Zwei Instanzen desselben anonymen Typs sind gleich, wenn die Werte ihrer Schlüssel Eigenschaften gleich sind.Two instances of the same anonymous type are equal if the values of their key properties are equal. Die folgenden Beispiele veranschaulichen, wie auf Gleichheit getestet wird.The following examples illustrate how equality is tested.

Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))

Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays False, because prod5 and prod6 do not 
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))

Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))

Schreibgeschützte WerteRead-Only Values

Die Werte von Schlüsseleigenschaften können nicht geändert werden.The values of key properties cannot be changed. Beispielsweise ist in prod8 im vorherigen Beispiel der Name und Price Felder sind read-only, aber OnHand kann geändert werden.For example, in prod8 in the previous example, the Name and Price fields are read-only, but OnHand can be changed.

' The following statement will not compile, because Name is a key
' property and its value cannot be changed.
' prod8.Name = "clamps"

' OnHand is not a Key property. Its value can be changed.
prod8.OnHand = 22

Anonyme Typen von AbfrageausdrückenAnonymous Types from Query Expressions

Abfrageausdrücke müssen nicht immer die Erstellung von anonymen Typen aufweisen.Query expressions do not always require the creation of anonymous types. Wenn möglich, verwenden sie einen vorhandenen Typ zum Speichern der Spaltendaten an.When possible, they use an existing type to hold the column data. Dies tritt auf, wenn die Abfrage entweder ganze Datensätze aus der Datenquelle oder nur ein Feld aus jedem Datensatz zurückgibt.This occurs when the query returns either whole records from the data source, or only one field from each record. In den folgenden Codebeispielen customers ist eine Auflistung von Objekten von einem Customer Klasse.In the following code examples, customers is a collection of objects of a Customer class. Die Klasse verfügt über zahlreiche Eigenschaften, und Sie können eine oder mehrere dieser Servertypen im Abfrageergebnis in beliebiger Reihenfolge enthalten.The class has many properties, and you can include one or more of them in the query result, in any order. In den ersten beiden Beispielen werden keine anonymen Typen erforderlich, da die Abfragen Elemente von benannten Typen auswählen:In the first two examples, no anonymous types are required because the queries select elements of named types:

  • custs1 enthält eine Auflistung von Zeichenfolgen, da cust.Name ist eine Zeichenfolge.custs1 contains a collection of strings, because cust.Name is a string.

    Dim custs1 = From cust In customers
                 Select cust.Name
    
  • custs2 enthält eine Auflistung von Customer Objekten, da jedes Element der customers ist ein Customer Objekt und das ganze Element von der Abfrage ausgewählt ist.custs2 contains a collection of Customer objects, because each element of customers is a Customer object, and the whole element is selected by the query.

    Dim custs2 = From cust In customers
                 Select cust
    

Entsprechende benannte Typen sind jedoch nicht immer verfügbar.However, appropriate named types are not always available. Möglicherweise möchten Kundennamen und Adressen für einen bestimmten Zweck, Kunden-ID-Nummern und Speicherorte für eine andere und Kundennamen, Adressen und Reihenfolge Verlaufseinträge für eine dritte auswählen.You might want to select customer names and addresses for one purpose, customer ID numbers and locations for another, and customer names, addresses, and order histories for a third. Anonyme Typen können Sie jede beliebige Kombination von Eigenschaften dar, in beliebiger Reihenfolge zu aktivieren, ohne zuerst deklariert einen neuen benannten Typ, um das Ergebnis aufzunehmen.Anonymous types enable you to select any combination of properties, in any order, without first declaring a new named type to hold the result. Stattdessen erstellt der Compiler einen anonymen Typ für jede Zusammenstellung von Eigenschaften.Instead, the compiler creates an anonymous type for each compilation of properties. Die folgende Abfrage wählt nur die Customer Name und ID-Nummer aus allen Customer -Objekt in customers.The following query selects only the customer's name and ID number from each Customer object in customers. Aus diesem Grund erstellt der Compiler einen anonymen Typ, der nur diese zwei Eigenschaften enthält.Therefore, the compiler creates an anonymous type that contains only those two properties.

Dim custs3 = From cust In customers
             Select cust.Name, cust.ID

Die Namen und die Datentypen der Eigenschaften des anonymen Typs stammen aus den Argumenten um Select, cust.Name und cust.ID.Both the names and the data types of the properties in the anonymous type are taken from the arguments to Select, cust.Name and cust.ID. Die Eigenschaften in einem anonymen Typ, der von einer Abfrage erstellt wird, sind immer Schlüsseleigenschaften.The properties in an anonymous type that is created by a query are always key properties. Wenn custs3 ausgeführt wird, in der folgenden For Each Schleife, das Ergebnis ist eine Auflistung von Instanzen eines anonymen Typs mit zwei Schlüsseleigenschaften Name und ID.When custs3 is executed in the following For Each loop, the result is a collection of instances of an anonymous type with two key properties, Name and ID.

For Each selectedCust In custs3
    Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next

Die Elemente in der Auflistung dargestellte custs3 sind stark typisiert, und Sie können IntelliSense verwenden, zum Navigieren durch die verfügbaren Eigenschaften und ihre Typen zu überprüfen.The elements in the collection represented by custs3 are strongly typed, and you can use IntelliSense to navigate through the available properties and to verify their types.

Weitere Informationen finden Sie unter Einführung in LINQ in Visual Basic.For more information, see Introduction to LINQ in Visual Basic.

Die Entscheidung, ob anonyme Typen verwenden.Deciding Whether to Use Anonymous Types

Bevor Sie ein Objekt als eine Instanz einer anonymen Klasse erstellen, erwägen Sie, ob dies die beste Option ist.Before you create an object as an instance of an anonymous class, consider whether that is the best option. Wenn verknüpfte Daten enthalten ein temporäres Objekt erstellt werden soll, und Sie benötigen keine weiteren Felder und Methoden, die möglicherweise eine vollständige Klasse enthalten, ist ein anonymer Typ eine gute Lösung.For example, if you want to create a temporary object to contain related data, and you have no need for other fields and methods that a complete class might contain, an anonymous type is a good solution. Anonyme Typen stellen auch praktisch, wenn Sie eine andere Auswahl von Eigenschaften für jede Deklaration möchten oder wenn Sie die Reihenfolge der Eigenschaften ändern möchten.Anonymous types are also convenient if you want a different selection of properties for each declaration, or if you want to change the order of the properties. Jedoch, wenn Ihr Projekt mehrere Objekte, die die gleichen Eigenschaften in einer festen Reihenfolge aufweisen enthält, können Sie sie leichter deklarieren mithilfe eines benannten Typs mit einem Klassenkonstruktor.However, if your project includes several objects that have the same properties, in a fixed order, you can declare them more easily by using a named type with a class constructor. Z. B. mit einem geeigneten Konstruktor, es ist einfacher, mehrere Instanzen von Deklarieren einer Product Klasse als es ist, mehrere Instanzen eines anonymen Typs deklarieren.For example, with an appropriate constructor, it is easier to declare several instances of a Product class than it is to declare several instances of an anonymous type.

' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)

' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}

Ein weiterer Vorteil von benannten Typen ist, dass der Compiler eine versehentliche Tippfehler neben einem Eigenschaftennamen erfasst werden kann.Another advantage of named types is that the compiler can catch an accidental mistyping of a property name. In den vorherigen Beispielen firstProd2, secondProd2, und thirdProd2 sollten Instanzen desselben anonymen Typs verwendet werden.In the previous examples, firstProd2, secondProd2, and thirdProd2 are intended to be instances of the same anonymous type. Wenn Sie unbeabsichtigt jedoch deklarieren thirdProd2 in einem der folgenden Methoden, dessen Typ wären unterschiedlich aus, die von firstProd2 und secondProd2.However, if you were to accidentally declare thirdProd2 in one of the following ways, its type would be different from that of firstProd2 and secondProd2.

' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}

Es gibt vor allem Einschränkungen bei der Verwendung von anonymen Typen, die auf Instanzen von benannten Typen nicht anwendbar sind.More importantly, there are limitations on the use of anonymous types that do not apply to instances of named types. firstProd2, secondProd2, und thirdProd2 Instanzen desselben anonymen Typs sind.firstProd2, secondProd2, and thirdProd2 are instances of the same anonymous type. Allerdings wird der Name für den freigegebenen anonymen Typ ist nicht verfügbar und kann nicht verwendet werden, wo ein Typname in Ihrem Code erwartet wird.However, the name for the shared anonymous type is not available and cannot appear where a type name is expected in your code. Z. B. kann kein anonymes Typs verwendet werden, definieren Sie die Signatur einer Methode um eine andere Variable Felds oder in der Typdeklaration einer deklarieren.For example, an anonymous type cannot be used to define a method signature, to declare another variable or field, or in any type declaration. Daher sind anonyme Typen nicht geeignet, wenn Sie die Freigabe von Informationen über Methoden verfügen.As a result, anonymous types are not appropriate when you have to share information across methods.

Eine Definition von anonymen TypenAn Anonymous Type Definition

Als Antwort auf die Deklaration einer Instanz eines anonymen Typs erstellt der Compiler eine neue Klassendefinition, die die angegebenen Eigenschaften enthält.In response to the declaration of an instance of an anonymous type, the compiler creates a new class definition that contains the specified properties.

Wenn der anonyme Typ mindestens eine Schlüsseleigenschaft enthält, überschreibt die Definition drei von geerbte Member Object: Equals, GetHashCode, und ToString.If the anonymous type contains at least one key property, the definition overrides three members inherited from Object: Equals, GetHashCode, and ToString. Der Code erzeugt zum Testen der Übereinstimmung und ermittelt, auf der Hashcodewert nur die Schlüsseleigenschaften betrachtet.The code produced for testing equality and determining the hash code value considers only the key properties. Wenn des anonymen Typs nur keine Schlüsseleigenschaften enthält ToString überschrieben wird.If the anonymous type contains no key properties, only ToString is overridden. Explizit benannte Eigenschaften eines anonymen Typs können nicht mit diesen generierten Methoden in Konflikt stehen.Explicitly named properties of an anonymous type cannot conflict with these generated methods. D. h., Sie können keine .Equals, .GetHashCode, oder .ToString um eine Eigenschaft zu benennen.That is, you cannot use .Equals, .GetHashCode, or .ToString to name a property.

Anonyme Typdefinitionen, bei denen mindestens einer Schlüsseleigenschaft auch implementieren die System.IEquatable<T> -Schnittstelle, in denen T ist der Typ des anonymen Typs.Anonymous type definitions that have at least one key property also implement the System.IEquatable<T> interface, where T is the type of the anonymous type.

Weitere Informationen zu den Code durch den Compiler und die Funktionalität der überschriebenen Methoden erstellt wird, finden Sie unter anonymen Typdefinition.For more information about the code created by the compiler and the functionality of the overridden methods, see Anonymous Type Definition.

Siehe auchSee Also

Objektinitialisierer: Benannte und anonyme TypenObject Initializers: Named and Anonymous Types
Lokaler TyprückschlussLocal Type Inference
Einführung in LINQ in Visual BasicIntroduction to LINQ in Visual Basic
Gewusst wie: Ableiten von Eigenschaftennamen und Typen in Deklarationen von anonymen TypenHow to: Infer Property Names and Types in Anonymous Type Declarations
Definition von anonymen TypenAnonymous Type Definition
KeyKey