Инициализаторы объектов и коллекций (Руководство по программированию в 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. Добавлена ссылка на раздел, содержащей дополнительные сведения об анонимных типах. |
Обратная связь от клиента. |