Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

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

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

---

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

Хотя инициализаторы объектов можно использовать практически в любой ситуации, особенно полезными они бывают в выражениях запросов 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};

Object initializers with nullable types

It is a compile-time error to use a collection initializer with a nullable struct.

Collection Initializers

Collection initializers let you specify one or more element intializers when you initialize a collection class that implements IEnumerable. The element initializers can be a simple value, an expression or an object initializer. By using a collection initializer you do not have to specify multiple calls to the Add method of the class in your source code; the compiler adds the calls.

The following examples shows two simple collection initializers:

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

The following collection initializer uses object initializers to initialize objects of the Cat class defined in an earlier example. Note that the individual object initializers are enclosed in braces and separated by commas.

List<Cat> cats = new List<Cat>

{

new Cat(){ Name="Sylvester", Age=8 },

new Cat(){ Name="Whiskers", Age=2},

new Cat() { Name="Sasha", Age=14}

};

You can specify null as an element in a collection initializer if the collection's Add method allows it.

List<Cat> moreCats = new List<Cat>

{

new Cat(){ Name="Furrytail", Age=5 },

new Cat(){ Name="Peaches", Age=4},

null

};