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

8.4Помеченные операторы

Помеченный_оператор позволяет предварить оператор языка меткой. Помеченные операторы разрешается использовать в блоках, но запрещается использовать как внедренные операторы.

помеченный_оператор: идентификатор : оператор_языка

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

Метка может указываться в операторах goto (§8.9.3), находящихся в области ее видимости. Это означает, что оператор goto может передавать управление в пределах блока и за его пределы, но не внутрь блока.

Метки имеют собственную область объявления и не вступают в конфликт с другими идентификаторами. Например:

int F(int x) { if (x >= 0) goto x; x = -x; x: return x; }

является допустимым; в нем имя x используется и как параметр, и как метка.

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

Помимо достижимости в рамках обычного потока управления, помеченный оператор может быть достижимым в случае, если его метка указывается в достижимом операторе goto. (Имеется исключение: если оператор goto находится внутри оператора try, включающего блок finally, а помеченный оператор находится вне оператора try, и при этом конечная точка блока finally недостижима, то помеченный оператор недостижим из такого оператора goto.)

8.5Операторы объявления

Оператор_объявления объявляет локальную переменную или константу. Операторы объявления разрешается использовать в блоках, но запрещается использовать как внедренные операторы.

оператор_объявления: объявление_локальной_переменной ; объявление_локальной_константы ;

8.5.1Объявления локальных переменных

Объявление_локальной_переменной объявляет одну или несколько локальных переменных.

объявление_локальнной_переменной: тип_локальной_переменной деклараторы_локальных_переменных

тип_локальной_переменной: тип var

деклараторы_локальных_переменных: декларатор_локальной_переменной деклараторы_локальных_переменных , декларатор_локальной_переменной

декларатор_локальной_переменной: идентификатор идентификатор = инициализатор_локальной_переменной

инициализатор_локальной_переменной: выражение инициализатор_массива

Тип_локальной_переменной в объявлении_локальной_переменной либо непосредственно задает тип переменных, представленных в данном объявлении, либо с помощью идентификатора var показывает, что тип неявно определяется инициализатором. За типом следует список деклараторов_локальных_переменных, каждый из которых представляет новую переменную. Декларатор_локальной_переменной состоит из идентификатора, определяющего имя переменной, за которым могут следовать лексема = и инициализатор_локальной_переменной, присваивающий переменной начальное значение.

В контексте объявления локальной переменной, идентификатор var выступает в качестве ключевого слова контекста (§2.4.3). Если тип_локальной_переменной задан как var и в области видимости тип с именем var не используется, такое объявление называется объявлением неявно введенной локальной переменной: ее тип определяется типом соответствующего выражения инициализатора. В отношении объявлений неявно введенных локальных переменных действуют следующие ограничения.

  • Объявление_локальной_переменной не может содержать несколько деклараторов_локальных_переменных.

  • Декларатор_локальной_переменной должен включать инициализатор_локальной_переменной.

  • Инициализатор_локальной_переменной должен представлять собой выражение.

  • Выражение инициализатора должно иметь тип, определяемый во время компиляции.

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

Далее приводятся примеры неверных объявлений неявно введенных локальных переменных:

var x; // Error, no initializer to infer type from var y = {1, 2, 3}; // Error, array initializer not permitted var z = null; // Error, null does not have a type var u = x => x + 1; // Error, anonymous functions do not have a type var v = v++; // Error, initializer cannot refer to variable itself

Значение локальной переменной получается из выражения с использованием простого_имени (§7.6.2), а изменяется значение локальной переменной путем присваивания (§7.17). Локальная переменная требует определенного присваивания (§5.3) везде, где получается ее значение.

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

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

Например:

void F() { int x = 1, y, z = x * 2; }

в точности соответствует следующем коду:

void F() { int x; x = 1; int y; int z; z = x * 2; }

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

var i = 5; var s = "Hello"; var d = 1.0; var numbers = new int[] {1, 2, 3}; var orders = new Dictionary<int,Order>();

Эти объявления неявно введенных локальных переменных в точности эквивалентны следующим объявлениям с явным определением типа:

int i = 5; string s = "Hello"; double d = 1.0; int[] numbers = new int[] {1, 2, 3}; Dictionary<int,Order> orders = new Dictionary<int,Order>();

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