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

3.2Завершение приложения

При завершении приложения управление возвращается среде выполнения.

Если возвращаемое значение метода точки входа приложения имеет тип int, то оно служит кодом состояния завершения приложения. Целью данного кода является передача среде выполнения сведений о том, успешно ли прошло выполнение, или имел место сбой.

Если возвращаемое значение метода точки входа имеет тип void, то достижение правой фигурной скобки (}), завершающей данный метод, или выполнение инструкции return без выражения приведет к коду статуса завершения со значением 0.

Перед завершением приложения для всех его объектов, которые еще не были собраны сборщиком мусора, вызываются деструкторы, если такая очистка не была отключена (например, путем вызова метода библиотеки GC.SuppressFinalize).

3.3Объявления

Объявления в программе на C# определяют составные элементы программы. Программы на C# организованы посредством использования пространств имен (§9), которые могут содержать объявления типов и объявления вложенных пространств имен. Объявления типов (§9.6) используются для задания классов (§10), структур (§10.14), интерфейсов (§13), перечисляемых типов (§14) и делегатов (§15). Типы членов, разрешенных в объявлении типов, зависят от формы объявления типа. Например, объявления классов могут содержать объявления для констант (§10.4), полей (§10.5), методов (§10.6), свойств (§10.7), событий (§10.8), индексаторов (§10.9), операторов (§10.10), конструкторов экземпляров (§10.11), статических конструкторов (§10.12), деструкторов (§10.13) и вложенных типов (§10.3.8).

Объявление определяет имя в области объявления, которому принадлежит объявление. За исключением перегруженных членов (§3.6), наличие двух или более объявлений, представляющих члены с одним именем в области объявления, является ошибкой времени компиляции. Недопустимо, чтобы область объявления содержала различные типы членов с одинаковыми именами. Например, область объявления не может содержать поля и метода с одинаковыми именами.

Существует несколько типов областей объявлений, которые представлены далее.

  • В рамках всех исходных файлов программы объявления_членов_пространства_имен без вмещающего объявления_пространства_имен являются членами единой комбинированной области объявления, которая называется глобальная область объявления.

  • В рамках всех исходных файлов программы объявления_членов_пространства_имен в объявлении_пространства_имен с аналогичным полным именем пространства имен являются членами одной комбинированной области объявления.

  • Каждый класс, структура или интерфейс объявления создает новую область объявления. Имена вводятся в такую область объявления с помощью объявлений_членов_класса, объявлений_членов_структуры, объявлений_членов_интерфейса или параметров_типа. Исключая перегруженные объявления конструктора экземпляров и объявления статического конструктора, класс или структура не могут содержать объявление члена с одинаковым именем в классе или структуре. Класс, структура или интерфейс допускает объявление перегруженных методов и индексаторов. Более того, класс или структура допускают объявление перегруженных конструкторов экземпляров и операторов. Например, класс, структура или интерфейс могут содержать несколько объявлений методов с одним именем с условием, что данные объявления методов отличаются по сигнатуре (§3.6). Обратите внимание, что базовые классы не размещаются в области объявления класса, а также базовые интерфейсы не размещаются в области объявления интерфейса. Таким образом производный класс или интерфейс могут содержать объявление члена с одинаковым именем в качестве унаследованного члена. Такой член скрывает унаследованный член.

  • Каждое объявление делегата создает новую область объявления. Имена размещаются в данной области объявления посредством формальных параметров (фиксированных_параметров и массивов_параметров) и параметров_типа.

  • Каждое объявление перечисляемого типа создает новую область объявления. Имена размещаются в данной области объявления посредством объявлений_членов_перечисляемых_типов.

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

  • Каждый блок или блок_switch, а также инструкции for, foreach и using создают область объявлений для локальных переменных и локальных констант . Имена размещаются в данной области объявления посредством объявлений_локальной_переменной и объявлений_локальной_константы. Обратите внимание, что блоки, встречающиеся в качестве тела члена функции или анонимной функции (или внутри них), вложены в область объявлений локальных переменных, объявленной этими функциями для соответствующих параметров. Следовательно, наличие, к примеру, метода с одинаковыми именами локальной переменной и параметра является ошибкой.

  • Каждый блок или блок_switch создает отдельную область объявления для меток. Имена размещаются в данной области объявления посредством помеченных_операторов, а также ссылки на имена даются посредством операторов_goto. Область объявления метки блока содержит любые вложенные блоки. Таким образом в рамках вложенного блока невозможно объявить метку с одинаковым именем метки в родительском блоке.

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

  • Порядок объявления объявлений полей и локальных переменных определяет порядок выполнения их инициализаторов (при их наличии).

  • Локальные переменные должны быть заданы до их использования (§3.7).

  • Порядок объявлений членов перечислений (§14.3) важен, если опущены значения константных_выражений.

Область объявления пространства имен является «открыто завершенной», поэтому два объявления пространств имен с одинаковыми полными именами размещаются в одной области объявления. Пример:

namespace Megacorp.Data { class Customer { ... } }

namespace Megacorp.Data { class Order { ... } }

Два рассмотренных выше объявления пространств имен размещаются в одной области объявления, и в этом случае объявляются два класса с полными именами Megacorp.Data.Customer и Megacorp.Data.Order. Поскольку два объявления размещаются в одной области объявления, если в каждом объявлении содержится объявление класса с одинаковым именем, происходит ошибка времени компиляции.

Согласно указанному выше, область объявления блока содержит любые вложенные блоки. Поэтому в следующем примере методы F и G приводят к ошибке времени выполнения, так как имя i объявлено во внешнем блоке и не может быть повторно объявлено во внутреннем блоке. Однако методы H и I верны, так как два имени i объявлены в отдельных невложенных блоках.

class A { void F() { int i = 0; if (true) { int i = 1; } }

void G() { if (true) { int i = 0; } int i = 1; }

void H() { if (true) { int i = 0; } if (true) { int i = 1; } }

void I() { for (int i = 0; i < 10; i++) H(); for (int i = 0; i < 10; i++) H(); } }

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