Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch)

Aktualisiert: November 2007

Mit Objektinitialisierern können Sie zum Zeitpunkt der Erstellung Werte zu Feldern oder Eigenschaften eines Objekts, auf die Sie zugreifen können, zuweisen, ohne explizit einen Konstruktor aufrufen zu müssen. Im folgenden Beispiel wird gezeigt, wie ein Objektinitialisierer mit einem benannten Typ verwendet wird. Beachten Sie die Verwendung automatisch implementierter Eigenschaften in der Test-Klasse. Weitere Informationen finden Sie unter Automatisch implementierte Eigenschaften (C#-Programmierhandbuch).

private class Cat
{
    // Auto-implemented properties
    public int Age { get; set; }
    public string Name { get; set; }
}

static void MethodA()
{
    // Object initializer
    Cat cat = new Cat { Age = 10, Name = "Sylvester" };
}

Objektinitialisierer mit anonymen Typen

Obwohl Objektinitialisierer in jedem Kontext verwendet werden können, sind sie vor allem in LINQ-Abfrageausdrücken nützlich. Abfrageausdrücke nutzen häufig anonyme Typen, die nur mit einem Objektinitialisierer initialisiert werden können. In der select-Klausel kann ein Abfrageausdruck Objekte der ursprünglichen Sequenz in Objekte transformieren, deren Wert und Form sich vom Original unterscheiden. Dies ist vor allem dann nützlich, wenn Sie nur einen Teil der Informationen in jedem Objekt in einer Sequenz speichern möchten. Im folgenden Beispiel wird angenommen, dass ein Produktobjekt (p) viele Felder und Methoden enthält und dass Sie nur eine Sequenz von Objekten erstellen möchten, die den Produktnamen und den Einzelpreis enthält.

var productInfos =
    from p in products
    select new { p.ProductName, p.UnitPrice };

Wenn diese Abfrage ausgeführt wird, enthält die productInfos-Variable eine Sequenz an Objekten, auf die Sie über eine foreach-Anweisung, wie im folgenden Beispiel gezeigt, zugreifen können:

foreach(var p in productInfos){...}

Jedes Objekt im neuen anonymen Typ hat zwei öffentliche Eigenschaften, die die gleichen Namen wie die Eigenschaften oder Felder im ursprünglichen Objekt erhalten. Sie können ein Feld auch umbenennen, wenn Sie einen anonymen Typ erstellen. Im folgenden Beispiel wird das UnitPrice-Feld in Price umbenannt.

select new {p.ProductName, Price = p.UnitPrice};

Objektinitialisierer mit dem Typ, der NULL-Werte zulässt

Die Verwendung eines Auflistungsinitialisierers mit einer Struktur, die Null-Werte zulässt, ist ein Fehler, der zum Zeitpunkt der Kompilierung auftritt.

Auflistungsinitialisierer

Mit Auflistungsinitialisierern können Sie einen oder mehrere Elementinitialisierer festlegen, wenn Sie eine Auflistungsklasse initialisieren, die IEnumerable implementiert. Die Elementinitialisierer können ein einfacher Wert, ein Ausdruck oder ein Objektinitialisierer sein. Durch den Einsatz eines Auflistungsinitialisierers müssen Sie nicht mehrere Aufrufe der Add-Methode für die Klasse in Ihrem Quellcode angeben; der Compiler fügt die Aufrufe hinzu.

In den folgenden Beispielen werden zwei einfache Auflistungsinitialisierer dargestellt:

    List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

Der folgende Auflistungsinitialisierer verwendet Objektinitialisierer, um Objekte der Cat-Klasse, die in einem vorherigen Beispiel definiert wurden, zu initialisieren. Beachten Sie, dass die einzelnen Objektinitialisierer in geschweifte Klammern eingeschlossen und durch Kommas voneinander getrennt werden.

List<Cat> cats = new List<Cat>
{
    new Cat(){ Name="Sylvester", Age=8 },
    new Cat(){ Name="Whiskers", Age=2},
    new Cat() { Name="Sasha", Age=14}
};

Sie können Null als ein Element in einem Auflistungsinitialisierer festlegen, wenn die Add-Methode der Auflistung dies zulässt.

List<Cat> moreCats = new List<Cat>
{
    new Cat(){ Name="Furrytail", Age=5 },
    new Cat(){ Name="Peaches", Age=4},
    null
};

Siehe auch

Konzepte

C#-Programmierhandbuch

LINQ-Abfrageausdrücke (C#-Programmierhandbuch)

Referenz

Anonyme Typen (C#-Programmierhandbuch)