Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

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

Инициализатор объекта задает значения для нуля или нескольких полей или свойств объекта.

инициализатор_объекта: { список_инициализаторов_членовнеобязательно } { список_инициализаторов_членов , }

список_инициализаторов_членов: инициализатор_члена список_инициализаторов_членов , инициализатор_члена

инициализатор_члена: идентификатор = значение_идентификатора

значение_идентификатора: выражение инициализатор_объекта_или_коллекции

Инициализатор объекта состоит из последовательности инициализаторов членов, заключенных между лексемами { и } и разделенных запятыми. В каждом инициализаторе члена должно указываться имя доступного поля или свойства инициализируемого объекта, за которым следует знак равенства и выражение или инициализатор объекта или коллекции. Инициализатор объекта не может содержать более одного инициализатора члена для одного поля или свойства. Инициализатор объекта не может ссылаться на инициализируемый им объект.

Инициализатор члена, в котором после знака равенства указывается выражение, обрабатывается так же, как присваиванием (§7.17.1) полю или свойству.

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

Инициализатор члена, в котором после знака равенства указывается инициализатор коллекции, выполняет инициализацию внедренной коллекции. Вместо назначения полю или свойству новой коллекции элементы, указанные в инициализаторе, добавляются в коллекцию, на которую ссылается поле или свойство. Поле или свойство должно иметь тип коллекции, который удовлетворяет требованиям раздела §7.6.10.3.

Следующий класс представляет собой точку с двумя координатами.

public class Point { int x, y;

public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } }

Экземпляр Point можно создать и инициализировать следующим образом:

Point a = new Point { X = 0, Y = 1 };

что равносильно

Point __a = new Point(); __a.X = 0; __a.Y = 1; Point a = __a;

где __a является невидимой и недоступной другим образом временной переменной. Следующий класс представляет собой прямоугольник, создаваемый на основании двух точек:

public class Rectangle { Point p1, p2;

public Point P1 { get { return p1; } set { p1 = value; } } public Point P2 { get { return p2; } set { p2 = value; } } }

Экземпляр Rectangle можно создать и инициализировать следующим образом:

Rectangle r = new Rectangle { P1 = new Point { X = 0, Y = 1 }, P2 = new Point { X = 2, Y = 3 } };

что равносильно

Rectangle __r = new Rectangle(); Point __p1 = new Point(); __p1.X = 0; __p1.Y = 1; __r.P1 = __p1; Point __p2 = new Point(); __p2.X = 2; __p2.Y = 3; __r.P2 = __p2; Rectangle r = __r;

где __r, __p1 и __p2 являются временными переменными, не видимыми и недоступными другим образом.

Если конструктор Rectangle выделяет два внедренных экземпляра Point

public class Rectangle { Point p1 = new Point(); Point p2 = new Point();

public Point P1 { get { return p1; } } public Point P2 { get { return p2; } } }

то вместо назначения новых экземпляров для инициализации внедренных экземпляров Point можно использовать следующую конструкцию:

Rectangle r = new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } };

что равносильно

Rectangle __r = new Rectangle(); __r.P1.X = 0; __r.P1.Y = 1; __r.P2.X = 2; __r.P2.Y = 3; Rectangle r = __r;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]