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


Инициализаторы объектов и коллекций (Руководство по программированию в 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

Ошибка времени компиляции для использования инициализатора объектов с нулевыми структурой.

Инициализаторы набора

Инициализаторы набора позволяют задать один или несколько элементов инициализаторы при инициализации класс коллекции, реализующий 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#)