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

5.3.3.22Выражения вызова и выражения создания объекта

Для выражения вызова выражение в форме

первичное_выражение ( арг1 , арг2 , … , аргn )

или выражения создания объекта в форме

new тип ( арг1 , арг2 , … , аргn )

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

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

  • для выражения создания объекта состояние определенного присваивания переменной v перед арг1 соответствует состоянию переменной v перед выражением;

  • для каждого аргумента аргi состояние определенного присваивания переменной v после аргi определяется обычными правилами выражений с игнорированием модификаторов ref или out;

  • для каждого аргумента аргi при i больше единицы состояние определенного присваивания переменной v перед аргi соответствует состоянию переменной v после аргi-1;

  • если переменная v передается в качестве аргумента out (например, аргумента в виде «out v») в любом из аргументов, переменная v после выражения является определенно присвоенной. В обратном случае состояние переменной v после выражения соответствует состоянию переменной v после аргn;

  • для инициализаторов массива (§7.6.10.4), инициализаторов объектов (§7.6.10.2), инициализаторов коллекций (§7.6.10.3) и инициализаторов анонимных объектов (§7.6.10.6) состояние определенного присваивания определяется подстановкой, в контексте которой определяются эти конструкции.

5.3.3.23Простые выражения присваивания

Для выражения expr в форме w = expr-rhs:

  • состояние определенного присваивания переменной v перед выражением expr-rhs соответствует состоянию определенного присваивания переменной v перед выражением expr.

  • если переменная w является той же самой переменной, что и переменная v, переменная v после выражения expr является определенно присвоенной. В обратном случае состояние определенного присваивания переменной v после выражения expr соответствует состоянию определенного присваивания переменной v после выражения expr-rhs.

5.3.3.24Выражения &&

Для выражения expr в форме expr-first && expr-second:

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

  • переменная v перед выражением expr-second является определенно присвоенной, если состояние переменной v после выражения expr-first является определенно присвоенным или «определенно присвоенным в результате выполнения выражения с итогом true». В обратном случае она не является определенно присвоенной;

  • состояние определенного присваивания переменной v после выражения expr определяется следующими правилами:

  • если переменная v после выражения expr-first является определенно присвоенной, переменная v после выражения expr также является определенно присвоенной;

  • в обратном случае, если состояние переменной v после выражения expr-second является определенно присвоенным, а состояние переменной v после выражения expr-first соответствует состоянию «определенно присвоенная в результате выполнения выражения с итогом false», переменная v после выражения expr является определенно присвоенной;

  • в обратном случае, если переменная v после выражения expr-second является определенно присвоенной или «определенно присвоенной в результате выполнения выражения с итогом true», переменная v после выражения expr является «определенно присвоенной в результате выполнения выражения с итогом true»;

  • в обратном случае, если переменная v после выражения expr-first имеет состояние «определенно присвоенная в результате выполнения выражения с итогом false», а после выражения expr-second имеет состояние «определенно присвоенная в результате выполнения выражения с итогом false», то после выражения expr она имеет состояние «определенно присвоенная в результате выражения с итогом false»;

  • в обратном случае переменная v после выражения expr не является определенно присвоенной.

В этом примере

class A { static void F(int x, int y) { int i; if (x >= 0 && (i = y) >= 0) { // i definitely assigned } else { // i not definitely assigned } // i not definitely assigned } }

В данном примере переменная i считается определенно присвоенной только в одном из внедренных операторов оператора if. В операторе if в методе F переменная i является определенно присвоенной в первом внедренном операторе, поскольку выполнение выражения (i = y) всегда предшествует выполнению этого внедренного оператора. Наоборот, переменная i не является определенно присвоенной во втором внедренном операторе, поскольку проверка условия x >= 0 может завершиться с итогом false, в результате чего для переменной i не будет выполнено присваивание.

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