Операторы break, continue и goto
Состояние определенного присваивания переменной v в ветви потока управления, вызванной оператором break, continue или goto, соответствует состоянию определенного присваивания переменной v в начале оператора.
Операторы throw
Для операции stmt оператора в форме
throw expr ;
Состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию определенного присваивания переменной v в начале оператора stmt.
Операторы return
Для операции stmt оператора в форме
return expr ;
· Состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию определенного присваивания переменной v в начале оператора stmt.
· Если переменная v является выходным параметром, она должна быть определенно присвоена в одном из следующих случаев:
o после выражения expr;
o либо в конце блока finally конструкции try-finally или try-catch-finally, содержащей оператор return.
Для stmt оператора в форме:
return ;
· Если переменная v является выходным параметром, она должна быть определенно присвоена в одном из следующих случаев:
o перед оператором stmt;
o либо в конце блока finally конструкции try-finally или try-catch-finally, содержащей оператор return.
Операторы try-catch
Для stmt оператора в форме:
try try-block
catch(...) catch-block-1
...
catch(...) catch-block-n
· Состояние определенного присваивания переменной v в начале try-block соответствует состоянию определенного присваивания переменной v в начале операции stmt.
· Состояние определенного присваивания переменной v в начале catch-block-i (для любой переменной i) соответствует состоянию определенного присваивания переменной v в начале операции stmt.
· Переменная v в конечной точке операции stmt считается определенно присвоенной только в том случае, если переменная v определенно присвоена в конечной точке try-block и каждого catch-block-i (для каждой переменной i от 1 до n).
Операторы try-finally
Для операции stmt оператора try в форме:
try try-block finally finally-block
· Состояние определенного присваивания переменной v в начале try-block соответствует состоянию определенного присваивания переменной v в начале операции stmt.
· Состояние определенного присваивания переменной v в начале finally-block соответствует состоянию определенного присваивания переменной v в начале операции stmt.
· Переменная v в конечной точке операции stmt считается определенно присвоенной только при соблюдении по меньшей мере одного из следующих условий:
o переменная v является определенно присвоенной в конечной точке try-block;
o переменная v является определенно присвоенной в конечной точке finally-block.
При переключении потока управления (например, в операторе goto), которое начинается в try-block и завершается за пределами try-block, переменная v также считается определенно присвоенной в такой ветви потока управления, если переменная v является определенно присвоенной в конечной точке finally-block. (Это не единственная возможность — если переменная v является определенно присвоенной по другой причине при таком переключении потока управления, она все еще считается определенно присвоенной.)
Операторы try-catch-finally
Анализ определенного присвоения для оператора try-catch-finally в виде:
try try-block
catch(...) catch-block-1
...
catch(...) catch-block-n
finally finally-block
выполняется с допущением, что оператор try-finally содержит оператор try-catch:
try {
try try-block
catch(...) catch-block-1
...
catch(...) catch-block-n
}
finally finally-block
В следующем примере демонстрируется, как разные блоки оператора 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
}
}
Операторы foreach
Для операции stmt оператора foreach в форме:
foreach ( type identifier in expr ) embedded-statement
· состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию переменной v в начале операции stmt;
· состояние определенного присваивания переменной v при переключении потока управления на внедренный оператор или в конечную точку операции stmt соответствует состоянию переменной v в конце выражения expr.
Операторы using
Для операции stmt оператора using в форме:
using ( resource-acquisition ) embedded-statement
· состояние определенного присваивания переменной v в начале операции resource-acquisition соответствует состоянию переменной v в начале операции stmt.
· Состояние определенного присваивания переменной v при переключении потока управления на внедренный оператор соответствует состоянию переменной v в конце операции resource-acquisition.
Операторы lock
Для операции stmt оператора lock в форме:
lock ( expr ) embedded-statement
· состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию переменной v в начале операции stmt;
· Состояние определенного присваивания переменной v при переключении потока управления на внедренный оператор соответствует состоянию переменной v в конце выражения expr.
Операторы yield
Для операции stmt оператора yield return в форме:
yield return expr ;
· состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию переменной v в начале операции stmt;
· состояние определенного присваивания переменной v в конце операции stmt соответствует состоянию переменной v в конце выражения expr.
Оператор yield break не влияет на состояние определенного присвоения.