Sdílet prostřednictvím


Inicializátory objektu a kolekce (Průvodce programováním v C#)

Inicializátory objektů umožňují přiřadit hodnoty k jakýmkoli přístupným polím nebo vlastnostem objektu při vytváření, bez nutnosti vyvolání konstruktoru následovaného řádky příkazů přiřazení.Syntaxe inicializátoru objektu umožňuje zadat argumenty pro konstruktor, nebo tyto argumenty (a syntaxi se závorkami) vynechat. Následující příklad znázorňuje způsob používání inicializátoru objektu s pojmenovaným typem Cat a vyvolání výchozího konstruktoru.Nezapomeňte na používání automaticky implementovaných vlastností ve třídě Cat.Další informace naleznete v tématu Automaticky implementované vlastnosti (Průvodce programováním v C#).

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

Inicializátory objektů s anonymními typy

Ačkoli lze inicializátory objektů použít v libovolném kontextu, jsou užitečné především ve výrazech dotazů LINQ.Výrazy dotazů používají často anonymní typy, které lze inicializovat pouze pomocí inicializátoru objektu, jak je znázorněno v následující deklaraci.

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

Anonymní typy umožňují klauzuli select ve výrazu dotazu LINQ transformovat objekty původní sekvence na objekty, jejichž hodnota a tvar se může lišit od původních parametrů.Tato možnost je užitečná, pokud chcete uložit pouze část informace z jednotlivých objektů v sekvenci.V následujícím příkladu předpokládejme, že objekt produktu (p) obsahuje mnoho polí a metod a vy chcete vytvořit pouze sekvenci objektů, které obsahují název produktu a jednotkovou cenu.

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

Při provedení tohoto dotazu bude proměnná productInfos obsahovat sekvenci objektů, které jsou přístupné v příkazu foreach, jak je uvedeno v tomto příkladu:

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

Jednotlivé objekty v novém anonymním typu mají dvě veřejné vlastnosti, kterým budou přiděleny stejné názvy, jako mají vlastnosti nebo pole v původním objektu.Při vytváření anonymního typu můžete pole také přejmenovat; následující příklad přejmenuje pole UnitPrice na pole Price.

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

Inicializátory objektů s typy s možnou hodnotou null

Pokud použijete inicializátor objektu se strukturou null, dojde k chybě v době kompilace.

Inicializátory kolekce

Inicializátory kolekce umožňují určit jeden nebo více inicializátorů prvku při inicializaci třídy kolekce, která implementuje třídu IEnumerable.Inicializátory prvku mohou být tvořeny jednoduchou hodnotou, výrazem nebo inicializátorem objektu.Při používání inicializátoru kolekce nemusíte metodě Add třídy ve zdrojovém kódu zadávat větší počet volání; volání přidá kompilátor.

Následující příklady znázorňují dva jednoduché inicializátory kolekce:

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

Následující inicializátor kolekce používá inicializátory objektů k inicializaci objektů třídy Cat definované v předchozím příkladu.Pamatujte, že jednotlivé incializátory objektů jsou uzavřeny ve složených závorkách a odděleny čárkami.

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

Pokud to metoda Add kolekce umožňuje, můžete zadat hodnotu null jako prvek v incializátoru kolekce.

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

Příklad

// 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.
}

Viz také

Referenční dokumentace

Anonymní typy (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#

LINQ – výrazy dotazů (Průvodce programováním v C#)