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

7.6.10.6Выражения создания анонимных объектов

Выражение_создания_анонимного_объекта используется для создания объекта анонимного типа.

выражение_создания_анонимного_объекта: new инициализатор_анонимного_объекта

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

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

декларатор_члена: простое_имя доступ_к_члену доступ_base идентификатор = выражение

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

new { p1 = e1 , p2 = e2 , … pn = en }

объявляет анонимный тип вида

class __Anonymous1 { private readonly T1 f1 ; private readonly T2 f2 ; … private readonly Tn fn ;

public __Anonymous1(T1 a1, T2 a2,…, Tn an) { f1 = a1 ; f2 = a2 ; … fn = an ; }

public T1 p1 { get { return f1 ; } } public T2 p2 { get { return f2 ; } } … public Tn pn { get { return fn ; } }

public override bool Equals(object o) { … } public override int GetHashCode() { … } }

где каждый Tx является типом соответствующего выражения ex. Выражение, используемое в деклараторе_члена, должно иметь тип. Поэтому, если выражение в деклараторе_члена равно null или является анонимной функцией, возникает ошибка времени компиляции. Ошибка времени компиляции также возникает, если выражение имеет небезопасный тип.

Имя анонимного типа автоматически создается компилятором, и на него нельзя ссылаться в тексте программы.

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

В примере

var p1 = new { Name = "Lawnmower", Price = 495.00 }; var p2 = new { Name = "Shovel", Price = 26.95 }; p1 = p2;

присваивание на последней строке допускается, потому что p1 и p2 имеют один анонимный тип.

Методы Equals и GetHashcode для анонимных типов перегружают методы, унаследованные от класса object, и определяются через методы Equals и GetHashcode для свойств таким образом, что два экземпляра одного анонимного типа будут равны, только если равны все их свойства.

Название декларатора члена можно сократить до простого имени (§7.5.2), доступа к члену (§7.5.4) или доступа base (§7.6.8). Такой способ называется инициализацией проекции и представляет собой удобный способ для объявления присваивания свойству с таким же именем. В частности, деклараторы членов вида

идентификатор выражение . идентификатор

в точности совпадают со следующими выражениями соответственно:

идентификатор = идентификатор идентификатор = выражение . идентификатор

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

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