Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch)

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, Cat, verwendet wird.Beachten Sie die Verwendung automatisch implementierter Eigenschaften in der Cat-Klasse.Weitere Informationen finden Sie unter Automatisch implementierte Eigenschaften (C#-Programmierhandbuch).

class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };

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 verwenden häufig anonyme Typen, die nur mit einem Objektinitialisierer initialisiert werden können, wie in der folgenden Deklaration veranschaulicht.

var pet = new { Age = 10, Name = "Fluffy" };

Anonyme Typen ermöglichen der select-Klausel in einem LINQ-Abfrageausdruck, Objekte der ursprünglichen Sequenz in Objekte zu transformieren, deren Wert und Form sich vom Original unterscheiden können.Dies ist nützlich, wenn Sie nur einen Teil der Informationen aus 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

Es ist ein Kompilierungsfehler, um eines Objektinitialisierers mit einer auf NULL festlegbaren Struktur zu verwenden.

Auflistungsinitialisierer

Auflistungsinitialisierer können Sie eine oder mehrere Elementinitialisierer angeben, 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
};

Beispiel

// The following code consolidates examples from the topic.
class ObjInitializers
{
    class Cat
    {
        // Auto-implemented properties.
        public int Age { get; set; }
        public string Name { get; set; }
    }

    static void Main()
    {
        Cat cat = new Cat { Age = 10, Name = "Fluffy" };

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

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

        // Display results.
        System.Console.WriteLine(cat.Name);

        foreach (Cat c in cats)
            System.Console.WriteLine(c.Name);

        foreach (Cat c in moreCats)
            if (c != null)
                System.Console.WriteLine(c.Name);
            else
                System.Console.WriteLine("List element has null value.");
    }
    // Output:
    //Fluffy
    //Sylvester
    //Whiskers
    //Sasha
    //Furrytail
    //Peaches
    //List element has null value.
}

Siehe auch

Referenz

Anonyme Typen (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

LINQ-Abfrageausdrücke (C#-Programmierhandbuch)