Инициализаторы объектов и коллекций (Руководство по программированию в C#)

Инициализаторы объектов позволяют присваивать значения всем доступным полям и свойствам объекта во время создания без вызова конструктора, за которым следуют строки операторов присваивания. Синтаксис инициализатора объекта позволяет задавать аргументы конструктора или опускать их (и синтаксис в скобках). В следующем примере показаны использование инициализатора объекта с именованным типом Cat и вызов конструктора по умолчанию. Обратите внимание на использование в классе Cat автоматически внедренных свойств. Дополнительные сведения см. в разделе Автоматически реализуемые свойства (Руководство по программированию на C#).

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

Инициализаторы объектов с анонимными типами

Хотя инициализаторы объектов можно использовать в любом контексте, они особенно полезны в выражениях запросов LINQ. В выражениях запросов часто используются анонимные типы, которые можно инициализировать только с помощью инициализаторов объектов, как показано в следующем объявлении.

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

Анонимные типы позволяют предложению select в выражении запроса LINQ преобразовывать объекты исходной последовательности в объекты, значение и форма которых могут отличаться от исходных. Это бывает полезно, если требуется сохранить лишь часть информации от каждого объекта последовательности. В приведенном ниже примере предполагается, что у объекта продукта (p) имеется множество полей и методов, и требуется создать последовательность объектов, содержащую только имя продукта и его цену.

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

При выполнении этого запроса переменная productInfos будет содержать последовательность объектов, доступных в операторе foreach, как показано в следующем примере.

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

Каждый объект нового анонимного типа содержит два общедоступных свойства, имеющих те же имена, что и у свойств или полей исходного объекта. Кроме того, при создании анонимного типа можно переименовать поле; в следующем примере выполняется переименование поля UnitPrice в Price.

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

Инициализаторы объектов с типами, допускающими значение NULL

При попытке использовать инициализатор объекта со структурой, допускающей значение NULL, произойдет ошибка компиляции.

Инициализаторы коллекций

Инициализаторы коллекций позволяют задавать один или несколько инициализаторов элементов при инициализации класса коллекции, реализующего интерфейс IEnumerable. Инициализаторами элементов могут быть простые значения, выражения и инициализаторы объектов. При использовании инициализатора коллекции не требуется указывать в исходном коде несколько вызовов метода Add класса; эти вызовы добавляет компилятор.

Ниже приведены два примера простых инициализаторов коллекций.

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

В следующем инициализаторе коллекции используются инициализаторы объектов класса Cat, определенного в предыдущем примере. Обратите внимание, что инициализаторы отдельных объектов заключены в скобки и разделены запятыми.

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

В качестве элемента инициализатора коллекции можно указать значение null, если метод Add коллекции допускает это.

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

Пример

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

См. также

Ссылки

Анонимные типы (Руководство по программированию в C#)

Основные понятия

Руководство по программированию на C#

Выражения запросов LINQ (Руководство по программированию на C#)