Anonyme Typen (C#-Programmierhandbuch)
Aktualisiert: Juli 2008
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 der Eigenschaften wird vom Compiler abgeleitet. Das folgende Beispiel zeigt einen anonymen Typ, der mit zwei Eigenschaften mit den Namen Amount und Message initialisiert wird.
var v = new { Amount = 108, Message = "Hello" };
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 werden mithilfe des Operators new mit einem Objektinitialisierer erstellt. Weitere Informationen über Objektinitialisierer finden Sie unter Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch).
Anonyme Typen sind Klassen-Typen, die aus einer oder mehreren öffentlichen, schreibgeschützten Eigenschaften bestehen. Es werden keine anderen Arten von Klassenmembern, z. B. Methoden oder Ereignisse, zugelassen. Ein anonymer Typ kann in keine Schnittstelle und keinen Typ mit Ausnahme von object umgewandelt werden.
Das häufigste Szenario besteht darin, einen anonymen Typ mit einigen Eigenschaften von einem anderen Typ zu initialisieren. Gehen Sie im folgenden Beispiel davon aus, dass eine Klasse mit dem Namen Product, die die Color-Eigenschaft und die Price-Eigenschaft sowie mehrere andere Eigenschaften, die für Sie nicht interessant sind, umfasst. Products ist eine Auflistung von Product-Objekten. Die anonyme Typdeklaration beginnt mit dem new-Schlüsselwort. Dadurch wird ein neuer Typ initialisiert, 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 einer Eigenschaft, die mit einem Ausdruck initialisiert wird, einen Namen geben.
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 ein anonymer Typ einer Variable zugewiesen wird, muss diese Variable mit dem var-Konstrukt initialisiert werden. Das liegt daran, dass nur der Compiler Zugriff auf den zugrunde liegenden Namen des anonymen Typs hat. Weitere Informationen über var finden Sie unter Implizit typisierte lokale Variablen (C#-Programmierhandbuch).
Hinweise
Anonyme Typen sind Referenztypen, die sich direkt vom Objekt ableiten. Der Compiler gibt ihnen einen Namen, obwohl Ihre Anwendung nicht darauf zugreifen kann. Hinsichtlich der Common Language Runtime unterscheidet sich ein anonymer Typ nicht von anderen Referenztypen. Er kann jedoch in keinen anderen Typ als object umgewandelt werden.
Wenn zwei oder mehr anonyme Typen die gleiche Anzahl und den gleichen Typ an Eigenschaften in der gleichen Reihenfolge haben, behandelt der Compiler sie als gleichen Typ und sie nutzen gemeinsam die vom Compiler erstellten Typinformationen.
Ein anonymer Typ hat einen Methodenbereich. Um einen anonymen Typ, bzw. eine Auflistung mit anonymen Typen, außerhalb der Methodengrenze zu übergeben, müssen Sie den Typ zuerst in Objekt umwandeln. Dies wirkt jedoch der starken Typisierung des anonymen Typs entgegen. Wenn Sie Ihre Abfrageergebnisse speichern oder außerhalb der Methodengrenze übergeben müssen, verwenden Sie doch eine gewöhnliche benannte Struktur oder Klasse anstelle des anonymen Typs.
Anonyme Typen können keine unsicheren Typen als Eigenschaften enthalten.
Da die Equals-Methode und die GetHashCode-Methode für anonyme Typen mithilfe von Equals und GetHashcode der Eigenschaften definiert sind, sind zwei Instanzen desselben anonymen Typs nur dann gleich, wenn alle Eigenschaften übereinstimmen.
Siehe auch
Konzepte
LINQ-Abfrageausdrücke (C#-Programmierhandbuch)
Referenz
Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch)
Weitere Ressourcen
Änderungsprotokoll
Date |
Versionsgeschichte |
Grund |
---|---|---|
Juli 2008 |
Informationen zu Umwandlungseinschränkungen zu Einführung und Hinweisen hinzugefügt. |
Informationsergänzung. |