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