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

10.11Конструкторы экземпляров

Конструктор экземпляра является членом, реализующим действия, необходимые для инициализации экземпляра класса. Конструкторы экземпляров объявляются с помощью объявлений_конструкторов:

объявление_конструктора: атрибутынеобязательно модификаторы_конструкторанеобязательно декларатор_конструктора тело_конструктора

модификаторы_конструктора: модификатор_конструктора модификаторы_конструктора модификатор_конструктора

модификатор_конструктора: public protected internal private extern

декларатор_конструктора: идентификатор ( список_формальных_параметровнеобязательно ) инициализатор_конструкторанеобязательно

инициализатор_конструктора: : base ( список_аргументовнеобязательно ) : this ( список_аргументовнеобязательно )

тело_конструктора: блок ;

Объявление_конструктора может включать набор атрибутов (§17), допустимое сочетание из четырех модификаторов доступа (§10.3.5) и модификатор extern (§10.6.7). В объявление конструктора запрещено включать один и тот же модификатор несколько раз.

Идентификатор в деклараторе_конструктора должен указывать имя класса, в котором объявлен конструктор экземпляров. Если указано любое другое имя, происходит ошибка времени компиляции.

Необязательный список_формальных_параметров конструктора экземпляров подчиняется тем же правилам, что и список_формальных_параметров метода (§10.6). Список формальных параметров определяет подпись (§3.6) конструктора экземпляров и управляет процессом, посредством которого разрешение перегрузки (§7.5.2) выбирает отдельный конструктор экземпляров в вызове.

Каждый тип, на который есть ссылка в списке_формальных_параметров конструктора экземпляров, должен быть, по крайней мере, так же доступным, как сам конструктор (§3.5.4).

Необязательный инициализатор_конструктора указывает другой конструктор экземпляров для вызова перед выполнением операторов, заданных в теле_конструктора этого конструктора экземпляров. Это описано далее в §10.11.1.

Если в объявление конструктора включен модификатор extern, конструктор называется внешним конструктором. Поскольку объявление внешнего конструктора не предоставляет фактическую реализацию, его тело_конструктора состоит из точки с запятой. Во всех других конструкторах тело_конструктора состоит из блока, в котором указаны операторы для инициализации нового экземпляра класса. Это в точности соответствует блоку экземпляра метода с типом возвращаемого значения void (§10.6.10).

Конструкторы экземпляров не наследуются. Таким образом, у класса нет конструкторов экземпляров, отличных от тех, что действительно объявлены в этом классе. Если класс не содержит объявления конструкторов экземпляров, автоматически предоставляется конструктор экземпляров по умолчанию (§10.11.4).

Конструкторы экземпляров вызываются выражениями_создания_объектов (§7.6.10.1) и посредством инициализаторов_конструкторов.

10.11.1Инициализаторы конструкторов

Все конструкторы экземпляров (за исключением конструкторов для класса object) неявно включают вызов другого конструктора экземпляров непосредственно перед телом_конструктора. Конструктор, который должен быть неявно вызван, определяется инициализатором_конструктора:

  • инициализатор конструктора экземпляров вида base(список_аргументовнеоб) побуждает вызов конструктора экземпляров из прямого базового класса. Этот конструктор выбирается с помощью списка_аргументов и правил разрешения перегрузки в §7.5.3. Набор конструкторов экземпляров – кандидатов включает все доступные конструкторы экземпляров, содержащиеся в прямом базовом классе, или конструктор по умолчанию (§10.11.4), если в прямом базовом классе не объявлены конструкторы экземпляров. Если этот набор пуст или если не удается идентифицировать один наилучший конструктор экземпляров, возникает ошибка времени компиляции.

  • инициализатор конструктора экземпляров вида this(список_аргументовнеоб) побуждает вызов конструктора экземпляров из самого класса. Конструктор выбирается с помощью списка_аргументов и правил разрешения перегрузки в §7.5.3. Набор конструкторов экземпляров – кандидатов состоит из всех доступных конструкторов экземпляров, объявленных в самом классе. Если этот набор пуст или если не удается идентифицировать один наилучший конструктор экземпляров, возникает ошибка времени компиляции. Если объявление конструктора экземпляров включает инициализатор конструктора, вызывающий сам конструктор, возникает ошибка времени компиляции.

Если у конструктора экземпляров нет инициализатора конструктора, неявно предоставляется инициализатор конструктора вида base(). Таким образом, объявление конструктора экземпляров вида

C(...) {...}

в точности эквивалентно

C(...): base() {...}

Область видимости параметров, заданных списком_формальных параметров объявления конструктора экземпляров, включает инициализатор конструктора этого объявления. Таким образом, инициализатору конструктора разрешен доступ к параметрам конструктора. Пример.

class A { public A(int x, int y) {} }

class B: A { public B(int x, int y): base(x + y, x - y) {} }

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

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