14.04.2010

Object Initializers в C# 3.0 или как не писать много конструкторов

В C# 3.0 появилась замечательная вещь - инициализаторы объектов (Object Initializers). Это, в принципе, syntactic sugar, и реально позволяет создавать объекты "короче", а значит, код становится простым и читаемым.

Рассмотрим, как раньше мы создавали объект:
class Contact
{
    public string Name { get; set; }
    public int YearofBirth { get; set; }
}

Contact c1 = new Contact();
c1.Name = "John";
c1.YearofBirth = 1980;

Если мы напишем для класса конструктор с двумя параметрами, то инициализация станет короче:
Contact c1 = new Contact("John", 1980);

Минус очевиден - для каждого набора параметров надо писать свой конструктор (значения по умолчанию для параметров появились лишь в C# 4.0). Но теперь нам доступен другой способ инициализации:
Contact c1 = new Contact { Name = "John", YearofBirth = 1980 };

Присваивания свойств идут через запятую в фигурных скобках, внутри скобок ";" не ставится.

Предположим, что конструктор обязательно должен принимать Name. Тогда можно инициализировать объект следующим образом:
Contact c1 = new Contact("Wei-Meng Lee") { YearofBirth=1980 };

Теперь мы имеем эффективное средство для инициализации свойств для ленивых, т.е. для нас, программистов.

Похожим образом теперь можно создавать коллекции - это называется Collection Initializers:

раньше
List Contacts = new List ();
Contacts.Add(new Contact { Name = "John", YearofBirth = 1980 });
Contacts.Add(new Contact { Name = "Mary", YearofBirth = 1986 });
Contacts.Add(new Contact { Name = "Richard",YearofBirth=1948 });

теперь
List Contacts = new List() {
    new Contact { Name = "John", YearofBirth = 1980 },
    new Contact { Name = "Mary", YearofBirth = 1986 },
    new Contact { Name = "Richard", YearofBirth = 1948 }
};

Комментариев нет: