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

Обновлен: Ноябрь 2007

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

private class Cat
{
    // Auto-implemented properties
    public int Age { get; set; }
    public string Name { get; set; }
}

static void MethodA()
{
    // Object initializer
    Cat cat = new Cat { Age = 10, Name = "Sylvester" };
}

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

Хотя инициализаторы объектов можно использовать практически в любой ситуации, особенно полезными они бывают в выражениях запросов LINQ. В выражениях запросов часто используются анонимные типы, которые можно инициилизировать только с помощью инициализаторов объектов. В инструкции select выражение запроса может преобразовывать исходную последовательность в объекты, значение и тип которых могут отличаться от оригинала. Это бывает полезно, если требуется сохранить лишь часть содержащейся в последовательности информации. В приведенном ниже примере предполагается, что у объекта продукта (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
};

См. также

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

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

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

Ссылки

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