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

7.6.10Оператор new

Оператор new используется для создания новых экземпляров типов.

Существует три формы выражений new:

  • Выражения создания объектов используются для создания новых экземпляров типов класса и типов значения.

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

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

Оператор new подразумевает создание экземпляра типа, но необязательно подразумевает динамическое выделение памяти. В частности, для экземпляров с типом значения не требуется дополнительная память помимо переменных, в которых они находятся, и при использовании new для создания экземпляров с типом значения динамическое выделение памяти не происходит.

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

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

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

инициализатор_объекта_или_коллекции: инициализатор_объекта инициализатор_коллекции

Тип выражения_создания_объекта должен быть равен типу_класса, типу_значения или параметру_типа. Тип не может быть типом_класса abstract.

Необязательный список_аргументов (§7.5.1) допускается, только если тип равен типу_класса или типу_структуры.

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

При обработке выражения создания объекта, которое включает инициализатор объекта или коллекции, сначала выполняется конструктор экземпляра, а затем выполняется инициализация члена или элемента, указанного в инициализаторе объекта (§7.6.10.2) или коллекции (§7.6.10.3).

Если какой-либо из аргументов в необязательном списке_аргументов имеет тип времени компиляции dynamic, то выражение_создания_объекта динамически привязано (§7.2.2), и во время выполнения применяются следующие правила, используя тип времени выполнения тех аргументов из списка_аргументов, которые имеют тип времени компиляции dynamic. Однако, для создания объекта выполняется ограниченная проверка времени компиляции, как описано в разделе §7.5.4.

Во время привязки обработка выражения_создания_объекта в виде new T(A), где T является типом_класса или типом_значения, а A является необязательным списком_аргументов, включает следующие этапы.

  • Если T имеет тип_значения и A не указан.

  • Выражение_создания_объекта является вызовом конструктора по умолчанию. Результатом выражения_создания_объекта является значение типа T, а именно значение T по умолчанию, определенное в §4.1.1.

  • Иначе, если T является параметром_типа и A не указан.

  • Если для T не были указаны ограничения типа значения или конструктора (§10.1.5), то возникает ошибка времени привязки.

  • Результатом выражения_создания_объекта является значение типа времени выполнения, к которому привязан параметр типа, а именно результат вызов конструктора по умолчанию для этого типа. Тип времени выполнения может быть типом значения или ссылочным типом.

  • Иначе, если T является типом_класса или типом_структуры:

  • Если T имеет тип_класса abstract, то возникает ошибка времени компиляции.

  • Вызываемый конструктор экземпляра определяется с помощью правил разрешения перегрузки из раздела §7.5.3. Набор кандидатов конструкторов экземпляров включает все доступные конструкторы экземпляров, объявленные в T, применимые в соответствии со списком A (§7.5.3.1). Если набор кандидатов конструкторов экземпляров пуст или невозможно определить один лучший конструктор экземпляра, то возникает ошибка времени привязки.

  • Результатом выражения_создания_объекта является значение типа T, а именно значение, получаемое при вызове конструктора экземпляра, определенного на предыдущем этапе.

  • Иначе выражение_создания_объекта является недопустимым и возникает ошибка времени привязки.

Даже если выражение_создания_объекта динамически привязано, тип времени компиляции все равно будет T.

Во время выполнения обработка выражения_создания_объекта в виде new T(A), где T является типом_класса или типом_структуры, а A является необязательным списком_аргументов, включает следующие этапы.

  • Если T является типом_класса:

  • Создается новый экземпляр класса T. Если для создания нового экземпляра недостаточно памяти, то возникает исключение System.OutOfMemoryException и дальнейшие этапы не выполняются

  • Все поля нового экземпляра инициализируются с помощью значений по умолчанию (§5.2).

  • В соответствии с правилами вызова функции-члена (§7.5.4) вызывается конструктор экземпляра. Ссылка на созданный экземпляр автоматически передается конструктору экземпляра, и к этому экземпляру можно обращаться из этого конструктора с помощью this.

  • Если T является типом_структуры:

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

  • В соответствии с правилами вызова функции-члена (§7.5.4) вызывается конструктор экземпляра. Ссылка на созданный экземпляр автоматически передается конструктору экземпляра, и к этому экземпляру можно обращаться из этого конструктора с помощью this.

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