Udostępnij za pośrednictwem


Obiektów i kolekcji inicjatorów (Podręcznik programowania C#)

Inicjatory obiektu pozwalają przypisać wartości wszystkim dostępne pola lub właściwości obiektu w czasie tworzenia bez konieczności jawnego wywołania konstruktora.Poniższy przykład pokazuje jak używać Inicjator obiektu o typie nazwanego Cat.Należy zauważyć użycie właściwości auto wdrożone w Cat klasy.Aby uzyskać więcej informacji, zobacz Właściwości auto wdrożone (Podręcznik programowania 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 obiektu z typami anonimowe

Chociaż inicjatory obiektu można użyć w dowolnym kontekście, są one szczególnie przydatne w LINQ kwerendy wyrażeń.Wyrażenia kwerendy upewnij częste stosowanie typy anonimowe, które mogą być inicjowane tylko przy użyciu obiektu inicjatorów, jak pokazano w następującej deklaracji.

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

Typy anonimowe umożliwić select w klauzuli LINQ kwerendy wyrażenie, aby przekształcić obiekty oryginalna kolejność obiektów, których wartość i kształt może różnić się od oryginału.Jest to przydatne, jeśli mają być przechowywane tylko część informacji z każdego obiektu w sekwencji.W poniższym przykładzie założono, że obiekt produktu (p) zawiera wiele pól i metod, i że jedynie są Państwo zainteresowani tworzenie sekwencję obiektów, które zawierają nazwę produktu i cenę jednostkową.

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

Gdy ta kwerenda jest wykonywana, productInfos zmienna będzie zawierać sekwencji obiektów, które są dostępne w foreach instrukcji, jak pokazano w poniższym przykładzie:

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

Każdy obiekt w nowe typ anonimowy ma dwie właściwości publiczne, które otrzymują takie same nazwy jak właściwości i pól w obiekcie oryginalnym.Można również zmienić nazwę pola, podczas tworzenia typ anonimowy; Poniższy przykład zmienia nazwę UnitPrice pola do Price.

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

Inicjatory obiektu z typami nullable

Jest to błąd kompilacji do inicjatorów obiektu za pomocą struct dopuszczający wartość null.

Inicjatory kolekcji

Inicjatory kolekcji pozwalają określić jeden lub więcej inicjatory element, podczas inicjowania klasy zbioru, który implementuje IEnumerable.Inicjatory element może być prostą wartością, wyrażenie lub Inicjator obiektu.Za pomocą inicjatora kolekcji nie trzeba określić kilka wywołań Add klasy w kodzie źródłowym; Kompilator dodaje wywołania.

Poniższe przykłady zawierają dwa inicjatory proste 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ące inicjator kolekcji używa obiektu inicjatory zainicjować obiekty z Cat klas zdefiniowanych w poprzednim przykładzie.Należy zauważyć, że inicjatory pojedynczego obiektu są ujęte w nawiasy klamrowe i oddzielone 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 }
};

Można określić null jako element w inicjatorze kolekcji Jeśli kolekcji Add metoda pozwala na to.

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 (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#

Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)