Anonyme Typen (C#-Programmierhandbuch)

Mit anonymen Typen können Sätze an schreibgeschützten Eigenschaften in ein einzelnes Objekt gekapselt werden, ohne zuerst einen Typ explizit definieren zu müssen.Der Typname wird vom Compiler generiert und ist nicht auf Quellcodeebene verfügbar.Der Typ jeder Eigenschaften wird vom Compiler abgeleitet.

Anonyme Typen werden mithilfe des Operators new zusammen mit einem Objektinitialisierer erstellt.Weitere Informationen über Objektinitialisierer finden Sie unter Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch).

Das folgende Beispiel zeigt einen anonymen Typ, der mit zwei Eigenschaften, Amount und Message, initialisiert wird.

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 einen Untersatz der Eigenschaften aus jedem Objekt in der Quellsequenz zurückzugeben.Weitere Informationen über Abfragen finden Sie unter LINQ-Abfrageausdrücke (C#-Programmierhandbuch).

Anonyme Typen enthalten mindestens eine öffentliche schreibgeschützte Eigenschaft.Es sind keine anderen Arten von Klassenmembern, z. B. Methoden oder Ereignisse, gültig.Der Ausdruck, der verwendet wird, um eine Eigenschaft zu initialisieren, kann nicht null, eine anonyme Funktion oder ein Zeigertyp sein.

Das häufigste Szenario besteht darin, einen anonymen Typ mit Eigenschaften von einem anderen Typ zu initialisieren.Im folgenden Beispiel wird angenommen, dass eine Klasse mit dem Namen Product vorhanden ist.Die Klasse Product enthält die Eigenschaften Color und Price zusammen mit anderen Eigenschaften, die nicht von Interesse sind.Die Variable products ist eine Auflistung von Product-Objekten.Die anonyme Typdeklaration beginnt mit dem new-Schlüsselwort.Die Deklaration initialisiert einen neuen Typ, der nur zwei Eigenschaften von Product verwendet.Dies bewirkt, dass eine kleinere Datenmenge in der Abfrage zurückgegeben wird.

Wenn Sie keine Membernamen im anonymen Typ angeben, gibt der Compiler den anonymen Typmembern den gleichen Namen wie die Eigenschaft, die zum Initialisieren verwendet wird.Sie müssen einen Namen für eine Eigenschaft angeben, die mit einem Ausdruck initialisiert wird, wie im vorherigen Beispiel gezeigt.Im folgenden Beispiel sind Color und Price die Eigenschaften des anonymen Typs.

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);
}

Normalerweise deklarieren Sie bei Verwendung eines anonymen Typs zum Initialisieren einer Variable, die Variable als implizit typisierte lokale Variable, indem Sie var verwenden.Der Typname kann nicht in der Variablendeklaration angegeben werden, da nur der Compiler Zugriff auf den zugrunde liegenden Namen des anonymen Typs hat.Weitere Informationen zu var finden Sie unter Implizit typisierte lokale Variablen (C#-Programmierhandbuch).

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 gezeigt.

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

Hinweise

Anonyme Typen sind - Klasse-Typen, die direkt von - Objekt ableiten und die keinem Typ außer - Objekt umgewandelt werden können.Der Compiler gibt einen Namen für jeden anonymen Typ an, obwohl die Anwendung nicht darauf zugreifen kann.Aus Sicht der Common Language Runtime ist ein anonymer Typ zu einem anderen Referenztyp nicht anders.

Wenn zwei oder anonymere Objektinitialisierer in einer Assembly eine Sequenz von Eigenschaften, die in der gleichen Reihenfolge sind und die die gleichen Namen und Typen haben, behandelt der Compiler die Objekte als Instanzen des gleichen Typs.Sie verwenden die gleichen vom Compiler generierten Typinformationen.

Sie können ein Feld, eine Eigenschaft, ein Ereignis oder den Rückgabetyp einer Methode nicht deklarieren, als hätten sie einen anonymen Typ.Entsprechend können Sie einen formalen Parameter einer Methode, Eigenschaft, eines Konstruktors oder Indexers nicht als über einen anonymen Typ verfügend deklarieren.Um einen anonymen Typ oder eine Auflistung mit anonymen Typen als Argument an eine Methode zu übergeben, können Sie den Parameter als Typobjekt deklarieren.Allerdings wird dadurch der Zweck der starken Typisierung zunichte gemacht.Wenn Sie Abfrageergebnisse speichern oder außerhalb der Methodengrenze übergeben müssen, verwenden Sie doch eine gewöhnliche benannte Struktur oder Klasse anstelle des anonymen Typs.

Da die Equals-Methode und die GetHashCode-Methode für anonyme Typen mithilfe von Equals und GetHashcode-Methoden der Eigenschaften definiert sind, sind zwei Instanzen desselben anonymen Typs nur dann gleich, wenn alle Eigenschaften übereinstimmen.

Siehe auch

Referenz

Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

LINQ-Abfrageausdrücke (C#-Programmierhandbuch)

Weitere Ressourcen

Erste Schritte mit LINQ in C#