Inicjatory obiektów i kolekcji (Przewodnik programowania w języku C#)

Inicjatory obiektów umożliwiają przypisywanie wartości do dowolnych dostępnych pól lub właściwości obiektu w czasie jego tworzenia, bez konieczności wywoływania konstruktora, po którym występują wiersze instrukcji przypisania.Składnia inicjatora obiektów umożliwia określenie argumentów dla konstruktora lub pominięcie argumentów (i składni z nawiasami). W poniższym przykładzie pokazano, jak używać inicjatora obiektów z typem nazwanym Cat i jak wywołać konstruktora domyślnego.Należy zwrócić uwagę na automatycznie implementowane właściwości w klasie Cat.Aby uzyskać więcej informacji, zobacz Właściwości zaimplementowane automatycznie (Przewodnik programowania w języku C#).

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

Inicjatory obiektów z typami anonimowymi

Mimo że inicjatorów obiektów można używać w dowolnym kontekście, są one szczególnie użyteczne w wyrażeniach zapytań programu LINQ.W wyrażeniach zapytań często są używane typy anonimowe, które można inicjować przy użyciu inicjatora obiektów, tak jak pokazano w poniższej deklaracji.

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

Typy anonimowe umożliwiają użycie klauzuli select w wyrażeniu zapytania programu LINQ w celu przekształcenia obiektów oryginalnej sekwencji w obiekty, których wartość i kształt mogą różnić się od oryginalnych.Jest to użyteczne, gdy chce się przechowywać tylko część informacji z każdego obiektu sekwencji.W poniższym przykładzie przyjęto założenie, że obiekt produktu (p) zawiera wiele pól i metod oraz że użytkownik jest zainteresowany wyłącznie utworzeniem sekwencji obiektów zawierających nazwę produktu i cenę jednostkową.

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

Po wykonaniu tego zapytania zmienna productInfos będzie zawierać sekwencję obiektów, do których można uzyskać dostęp w instrukcji foreach, tak jak pokazano w tym przykładzie:

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

Każdy obiekt w nowym typie anonimowym ma dwie właściwości publiczne, które otrzymują takie same nazwy, jak właściwości lub pola w oryginalnym obiekcie.Nazwę pola można też zmienić podczas tworzenia typu anonimowego; w poniższym przykładzie nazwa pola UnitPrice jest zmieniana na Price.

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

Inicjatory obiektów z typami zerowalnymi

Jest to błąd czasu kompilowania spowodowany użyciem inicjatora obiektów ze strukturą dopuszczającą wartości null.

Inicjatory kolekcji

Inicjatory kolekcji umożliwiają określenie co najmniej jednego inicjatora elementu podczas inicjowania klasy kolekcji, która implementuje interfejs IEnumerable.Inicjatory elementów mogą być wartościami prostymi, wyrażeniami lub inicjatorami obiektów.Gdy jest używany inicjator kolekcji, nie trzeba określać wielu wywołań metody Add klasy w kodzie źródłowym, ponieważ kompilator sam doda te wywołania.

W poniższych przykładach pokazano dwa proste inicjatory kolekcji:

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

Następujący inicjator kolekcji używa inicjatorów obiektów w celu zainicjowania obiektów klasy Cat zdefiniowanej w poprzednim przykładzie.Należy zauważyć, że poszczególne inicjatory obiektów są umieszczone w nawiasach klamrowych i rozdzielone przecinkami.

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

Jako element w inicjatorze kolekcji można określić wartość null, jeśli zezwala na to metoda Add kolekcji.

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

Przykład

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

Zobacz też

Informacje

Typy anonimowe (Przewodnik programowania w języku C#)

Koncepcje

Przewodnik programowania w języku C#

Wyrażenia kwerend LINQ (Przewodnik programowania w języku C#)