Операторы 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 не влияет на состояние определенного присвоения.

Наши рекомендации