Anonyme Typen (C#-Programmierhandbuch)Anonymous Types (C# Programming Guide)

Anonyme Typen stellen eine praktische Möglichkeit dar, einen Satz schreibgeschützter Eigenschaften in einem Objekt zu kapseln, ohne zuerst explizit einen Typ definieren zu müssen.Anonymous types provide a convenient way to encapsulate a set of read-only properties into a single object without having to explicitly define a type first. Der Typname wird vom Compiler generiert und ist auf Quellcodeebene nicht verfügbar.The type name is generated by the compiler and is not available at the source code level. Der Typ der einzelnen Eigenschaften wird vom Compiler abgeleitet.The type of each property is inferred by the compiler.

Sie erstellen anonyme Typen mit dem new-Operator und einem Objektinitialisierer.You create anonymous types by using the new operator together with an object initializer. Informationen über Objektinitialisierer finden Sie unterObjekt- und Auflistungsinitialisierer.For more information about object initializers, see Object and Collection Initializers.

Das folgende Beispiel veranschaulicht einen anonymen Typ, der mit den beiden Eigenschaften Amount und Message initialisiert wird.The following example shows an anonymous type that is initialized with two properties named Amount and Message.

var v = new { Amount = 108, Message = "Hello" };  

// Rest the mouse pointer over v.Amount and v.Message in the following  
// statement to verify that their inferred types are int and string.  
Console.WriteLine(v.Amount + v.Message);  

Anonyme Typen werden normalerweise in der select-Klausel eines Abfrageausdrucks verwendet, um von jedem Objekt in der Quellsequenz eine Teilmenge der Eigenschaften zurückzugeben.Anonymous types typically are used in the select clause of a query expression to return a subset of the properties from each object in the source sequence. Weitere Informationen zu Abfragen finden Sie unter LINQ-Abfrageausdrücke.For more information about queries, see LINQ Query Expressions.

Anonyme Typen enthalten mindestens eine schreibgeschützte Eigenschaft.Anonymous types contain one or more public read-only properties. Andere Arten von Klassenmembern wie Methoden oder Ereignisse sind ungültig.No other kinds of class members, such as methods or events, are valid. Der Ausdruck, der zum Initialisieren einer Eigenschaft verwendet wird, kann weder null noch eine anonyme Funktion oder ein Zeigertyp sein.The expression that is used to initialize a property cannot be null, an anonymous function, or a pointer type.

Das gängigste Szenario ist die Initialisierung eines anonymen Typs mit den Eigenschaften eines anderen Typs.The most common scenario is to initialize an anonymous type with properties from another type. Nehmen Sie im folgenden Beispiel an, dass eine Klasse mit dem Namen Product vorhanden ist.In the following example, assume that a class exists that is named Product. Die Product-Klasse enthält die Eigenschaften Color und Price sowie weitere Eigenschaften, die für Sie nicht relevant sind.Class Product includes Color and Price properties, together with other properties that you are not interested in. Die Variable products ist eine Auflistung von Product-Objekten.Variable products is a collection of Product objects. Die Deklaration eines anonymen Typs beginnt mit dem Schlüsselwort new.The anonymous type declaration starts with the new keyword. Die Deklaration initialisiert einen neuen Typ, der nur zwei Eigenschaften von Product verwendet.The declaration initializes a new type that uses only two properties from Product. Dadurch wird eine geringere Datenmenge in der Abfrage zurückgegeben.This causes a smaller amount of data to be returned in the query.

Wenn Sie im anonymen Typ keine Membernamen angeben, gibt der Compiler den Membern des anonymen Typs den Namen der Eigenschaft, mit der sie initialisiert werden.If you do not specify member names in the anonymous type, the compiler gives the anonymous type members the same name as the property being used to initialize them. Sie müssen einen Namen für eine Eigenschaft angeben, die mit einem Ausdruck initialisiert wird, wie im vorherigen Beispiel dargestellt.You must provide a name for a property that is being initialized with an expression, as shown in the previous example. Im folgenden Beispiel lauten die Namen der Eigenschaften des anonymen Typs Color und Price.In the following example, the names of the properties of the anonymous type are Color and Price.

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

Wenn Sie einen anonymen Typ zum Initialisieren einer Variablen verwenden, deklarieren Sie die Variable normalerweise mithilfe von var als implizit typisierte lokale Variable.Typically, when you use an anonymous type to initialize a variable, you declare the variable as an implicitly typed local variable by using var. Der Typname kann in der Variablendeklaration nicht angegeben werden, da nur der Compiler über Zugriff auf den zugrunde liegenden Namen des anonymen Typs verfügt.The type name cannot be specified in the variable declaration because only the compiler has access to the underlying name of the anonymous type. Weitere Informationen zu var finden Sie unter Implizit typisierte lokale Variablen.For more information about var, see Implicitly Typed Local Variables.

Sie können ein Array anonym typisierter Elemente erstellen, indem Sie eine implizit typisierte lokale Variable und ein implizit typisiertes Array kombinieren, wie im folgenden Beispiel veranschaulicht.You can create an array of anonymously typed elements by combining an implicitly typed local variable and an implicitly typed array, as shown in the following example.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};  

HinweiseRemarks

Anonyme Typen sind Klassentypen, die direkt vom Objekt abgleitet werden und in keinen anderen Typ als ein Objekt umgewandelt werden können.Anonymous types are class types that derive directly from object, and that cannot be cast to any type except object. Der Compiler gibt für jeden anonymen Typ einen Namen an, Ihre Anwendung kann jedoch nicht darauf zugreifen.The compiler provides a name for each anonymous type, although your application cannot access it. Aus der Perspektive der Common Language Runtime unterscheidet sich ein anonymer Typ nicht von anderen Verweistypen.From the perspective of the common language runtime, an anonymous type is no different from any other reference type.

Wenn zwei oder mehr anonyme Objektinitialisierer in einer Assembly eine Sequenz von Eigenschaften angeben, die die gleiche Reihenfolge und die gleichen Namen und Typen aufweisen, behandelt der Compiler die Objekte als Instanzen desselben Typs.If two or more anonymous object initializers in an assembly specify a sequence of properties that are in the same order and that have the same names and types, the compiler treats the objects as instances of the same type. Sie erhalten die gleichen vom Compiler generierten Typinformationen.They share the same compiler-generated type information.

Sie können ein Feld, eine Eigenschaft, ein Ereignis oder den Rückgabetyp einer Methode nicht mit einem anonymen Typ deklarieren.You cannot declare a field, a property, an event, or the return type of a method as having an anonymous type. Auch können Sie einen formalen Parameter einer Methode, einer Eigenschaft, eines Konstruktors oder eines Indexers nicht als anonymen Typ deklarieren.Similarly, you cannot declare a formal parameter of a method, property, constructor, or indexer as having an anonymous type. Um einen anonymen Typ oder eine Auflistung mit anonymen Typen als Argument einer Methode zu übergeben, können Sie den Parameter als Typobjekt deklarieren.To pass an anonymous type, or a collection that contains anonymous types, as an argument to a method, you can declare the parameter as type object. Dadurch wird jedoch der Zweck der starken Typisierung vereitelt.However, doing this defeats the purpose of strong typing. Wenn Sie Abfrageergebnisse speichern oder außerhalb der Methodengrenze übergeben müssen, könnten Sie statt eines anonymen Typs eine Struktur oder Klasse mit einem gewöhnlichen Namen verwenden.If you must store query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.

Da die Methoden Equals und GetHashCode von anonymen Typen anhand der Methoden Equals und GetHashCode der Eigenschaften definiert werden, sind zwei Instanzen eines anonymen Typs nur gleich, wenn alle Eigenschaften gleich sind.Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashCode methods of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

Siehe auchSee Also