Общие правила для операторов
· Переменная v не является определенно присвоенной в начале тела функции-члена.
· Переменная v является определенно присвоенной в начале каждой недостижимого оператора.
· Состояние определенного присваивания переменной v в начале каждого другого оператора определяется путем проверки состояния определенного присваивания переменной v во всех ветвлениях потоков управления, ведущих к началу этого оператора. Только в том случае, если переменная v является определенно присвоенной во всех таких ветвлениях потоков управления, переменная v считается определенно присвоенной в начале оператора. Набор возможных ветвлений потоков управления определяется точно так же, как и при проверке достижимости операторов (§8.1).
· Состояние определенного присвоения переменной v в конечной точке блока или оператора checked, unchecked, if, while, do, for, foreach, lock, using или switch определяется путем проверки состояния определенного присвоения переменной v во всех ветвях потоков управления, ведущих к конечной точке этого оператора. Если переменная v является определенно присвоенной во всех ветвях потоков управления, переменная v считается определенно присвоенной в конечной точке оператора. В противном случае переменная v не является определенно присвоенной в конечной точке оператора. Набор возможных ветвлений потоков управления определяется точно так же, как и при проверке достижимости операторов (§8.1).
Операторы блока, операторы checked и unchecked
Состояние определенного присваивания переменной v в ветви потока управления, ведущей к первому оператору в списке операторов блока (либо к конечной точке блока, если список операторов пуст) соответствует состоянию определенного присваивания переменной v перед блоком, оператором checked или unchecked.
Операторы-выражения
Для операции stmt, состоящего из выражений expr:
· переменная v имеет такое же состояние определенного присваивания к началу выражения expr, как и к началу оператора stmt;
· Если переменная v является определенно присвоенной к концу выражения expr, она считается определенно присвоенной в конечной точке оператора stmt; в противном случае она не является определенно присвоенной в конечной точке оператора stmt.
Операторы объявления
· Если оператор stmt является оператором объявления без инициализаторов, переменная v имеет такое же состояние определенного присваивания в конце оператора stmt, как и в начале оператора stmt.
· Если оператор stmt является оператором объявления с инициализаторами, состояние определенного присваивания для переменной v определяется таким образом, словно оператор stmt является списком операторов с отдельным оператором присваивания для каждого объявления с инициализатором (в порядке объявления).
Операторы If
Для операции stmt оператора if в форме:
if ( expr ) then-stmt else else-stmt
· переменная v имеет такое же состояние определенного присваивания к началу выражения expr, как и к началу оператора stmt;
· если переменная v является определенно присвоенной на конец выполнения выражения expr, она является определенно присвоенной в ветви потока управления до операции then-stmt, а также или в else-stmt, или в конечной точке операции stmt, если условие else отсутствует;
· если переменная v имеет состояние "определенно присвоенное в результате выполнения выражения с итогом true" в конце выражения expr, она считается определенно присвоенной в ветви потока управления до операции then-stmt и не является определенно присвоенной в ветви потока управления или в else-stmt, или в конечной точке операции stmt, если условие else отсутствует;
· если переменная v имеет состояние "определенно присвоенная после выполнения выражения с результатом false" в конце выражения expr, она является определенно присвоенной в ветви else-stmt и не является определенно присвоенной в ветви then-stmt. Эта переменная считается определенно присвоенной в конечной точке ветви stmt только в том случае, если она является определенно присвоенной в конечной точке then-stmt;
· в обратном случае переменная v не считается определенно присвоенной в ветви потока управления до операции then-stmt или else-stmt либо до конечной точки ветви stmt, если условие else отсутствует.
Операторы switch
В операторе выражения stmt оператора switch с управляющим выражением expr:
· состояние определенного присваивания переменной v в начале выражения expr соответствует состоянию переменной v в начале операции stmt;
· состояние определенного присваивания переменной v в ветви потока управления до списка достижимых операторов блока switch соответствует состоянию определенного присваивания переменной v в конце выражения expr.
Операторы while
Для операции stmt оператора while в форме:
while ( expr ) while-body
· переменная v имеет такое же состояние определенного присваивания к началу выражения expr, как и к началу оператора stmt;
· если переменная v является определенно присвоенной в конце выражения expr, она является определенно присвоенной в ветви потока управления до операции while-body и до конечной точки операции stmt;
· если переменная v имеет состояние "определенно присвоенное в результате выполнения выражения с итогом true" в конце выражения expr, она является определенно присвоенной в ветви потока управления до операции while-body, однако не является определенно присвоенной в конечной точке операции stmt;
· если переменная v имеет состояние "определенно присвоенная в результате выполнения выражения с итогом false" в конце выражения expr, она является определенно присвоенной в ветви потока управления до конечной точки операции stmt, однако не является определенно присвоенной в ветви потока управления до операции while-body.
Операторы do
Для операции stmt оператора do в форме:
do do-body while ( expr ) ;
· переменная v имеет такое же состояние определенного присваивания в ветви потока управления с начала операции stmt до операции do-body, как и в начале операции stmt.
· переменная v имеет такое же состояние определенного присваивания в начале выражения expr, как и в конечной точке операции do-body.
· если переменная v является определенно присвоенной в конечной точке expr, она является определенно присвоенной в ветви потока управления до конечной точки операции stmt.
· если переменная v имеет состояние "определенно присвоенная в результате выполнения выражения с итогом false" в конце выражения expr, она является определенно присвоенной в ветви потока управления до конечной точки stmt.
Операторы for
Проверка определенного присваивания для оператора for в форме:
for ( for-initializer ; for-condition ; for-iterator ) embedded-statement
выполняется для следующей формы оператора:
{
for-initializer ;
while ( for-condition ) {
embedded-statement ;
for-iterator ;
}
}
Если условие for в операторе for опущено, оценка определенного присваивания выполняется таким образом, словно условие for в приведенной выше развернутой записи оператора было заменено значением true.