Поделиться через


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

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

private 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
{
    private 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#)

Журнал изменений

Дата

Журнал

Причина

Октябрь 2010

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

Обратная связь от клиента.