Операция New используется для создания новых экземпляров классов и размерных типов. Имеется три формы операции New:
Выражение создания объекта (экземпляра класса или размерного типа).
Выражение создания экземпляра массива.
Выражение создания экземпляра делегата.
Операция создания объекта используется для создания экземпляра класса или размерного типа.
object-creation-expression:
New type constructor-specifieropt ( argument-listopt )
constructor-specifier:
. identifier
В выражении указывается тип создаваемого объекта, а также опциональные название конструктора и перечень аргументов. Если название конструктора не указано в выражении, то компилятор самостоятельно выводит подходящий конструктор количество и тип аргументов которого соответствуют количеству и типу выражений, переданных в списке аргументов. В случае невозможности обнаружения такого конструктора возникает ошибка компиляции.
Операция создания экземпляра массива используется для создания экземпляра массива.
array-creation-expression:
New non-array-type [ expression-list ] array-creation-expression-initializeropt
New ( array-type , array-initializer )
array-creation-expression-initializer:
= array-initializer
Операция создания экземпляра делегата используется для создания экземпляра делегата.
delegate-creation-expression:
New delegate-type ( expression )
Аргумент операции создания экземпляра делегата должен быть либо группой методов, либо значением типа-делегата. Если аргумент представляет собой группу методов, то он идентифицирует собственно метод и для экземплярных методов объект, для которого будет создан делегат. Если аргумент является значением типа-делегата, то он идентифицирует экземпляр делегата для которого будет создана копия.
Обработка операции создания экземпляра делегата в форме New D(E), где D – это тип-делегат, а E – выражение, во время компиляции производится следующим образом:
Если E представляет собой группу методов:
Множество методов, представляемых E, должно содержать ровно один метод совместимый с D и данный метод становится тем методом для которого будет создан делегат. Если совместимых с D методов не обнаружено или их более одного, то возникает ошибка компиляции. Если выбранный метод является экземплярным, то экземплярное выражение ассоциированное с E становится целевым объектом делегата.
Результатом операции является значение типа D, а именно вновь созданный экземпляр делегата ссылающийся на выбранный метод и целевой объект (ссылку на экземпляр).
Если E – это значение типа-делегата:
D и E должны быть совместимыми. В противном случае возникает ошибка компиляции.
Результатом операции является значение типа D, а именно вновь созданный экземпляр делегата ссылающийся на тот же список вызовов, что и E.
В противном случае операция создания экземпляра является недопустимой и возникает ошибка компиляции.
См.также: