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

5.3.3.13Операторы try-catch

Для оператора stmt в форме

try блок_try catch(...) блок_catch_1 ... catch(...) блок_catch_n

  • Состояние определенного присваивания переменной v в начале try-block соответствует состоянию определенного присваивания переменной v в начале операции stmt.

  • Состояние определенного присваивания переменной v в начале catch-block-i (для любой переменной i) соответствует состоянию определенного присваивания переменной v в начале операции stmt.

  • Переменная v в конечной точке операции stmt считается определенно присвоенной только в том случае, если переменная v определенно присвоена в конечной точке try-block и каждого catch-block-i (для каждой переменной i от 1 до n).

5.3.3.14Операторы try-finally

Для оператора stmt в форме

try блок_try finally блок_finally

  • Состояние определенного присваивания переменной v в начале блок_try соответствует состоянию определенного присваивания переменной v в начале операции stmt.

  • Состояние определенного присваивания переменной v в начале блок_finally соответствует состоянию определенного присваивания переменной v в начале операции stmt.

  • Переменная v в конечной точке операции stmt считается определенно присвоенной только при соблюдении по меньшей мере одного из следующих условий:

  • переменная v является определенно присвоенной в конечной точке блок_try

  • переменная v является определенно присвоенной в конечной точке блок_finally

При переключении потока управления (например, в операторе goto), которое начинается в блок_try и завершается вне его, переменная v также считается определенно присвоенной в такой ветви потока управления, если переменная v является определенно присвоенной в конечной точке блок_finally. (Это не единственная возможность — если переменная v является определенно присвоенной по другой причине при таком переключении потока управления, она все еще считается определенно присвоенной.)

5.3.3.15Операторы try-catch-finally

Анализ определенного присваивания для оператора try-catch-finally, имеющего форму

try блок_try catch(...) блок_catch_1 ... catch(...) блок_catch_n finally блок_finally:

выполняется с допущением, что оператор try-finally заключает оператор try-catch:

try { try блок_try catch(...) блок_catch_1 ... catch(...) блок_catch_n } finally блок_finally

В следующем примере демонстрируется, как разные блоки оператора try (§8.10) влияют на определенное присваивание.

class A { static void F() { int i, j; try { goto LABEL; // neither i nor j definitely assigned i = 1; // i definitely assigned }

catch { // neither i nor j definitely assigned i = 3; // i definitely assigned }

finally { // neither i nor j definitely assigned j = 5; // j definitely assigned } // i and j definitely assigned LABEL:; // j definitely assigned } }

5.3.3.16Операторы foreach

Для оператора foreach stmt в форме

foreach ( неуправляемый_тип: идентификатор in выражение ) внедренный_оператор

  • состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию переменной v в начале операции stmt;

  • состояние определенного присваивания переменной v при переключении потока управления на внедренный_оператор или в конечную точку операции stmt соответствует состоянию переменной v в конце выражения expr.

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