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

5.3.1Переменные с начальным значением

К переменным с начальным значением относятся следующие категории переменных:

  • Статические переменные.

  • Переменные экземпляра для экземпляров классов.

  • Переменные экземпляра переменных с типом struct с начальным значением.

  • Элементы массива.

  • Параметры по значению.

  • Параметры по ссылке.

  • Переменные, объявленные в предложении catch или операторе foreach.

5.3.2Переменные без начального значения

К переменным без начального значения относятся следующие категории переменных:

  • Переменные экземпляра переменных с типом struct без начального значения.

  • Выходные параметры, включая переменную this конструкторов экземпляра переменных с типом struct.

  • Локальные переменные, за исключением объявленных в предложении catch или операторе foreach.

5.3.3Точные правила для выявления определенного присваивания

Чтобы удостовериться, что каждая из используемых переменных является определенно присвоенной, компилятор должен использовать процесс, аналогичный рассмотренному в этом разделе.

Компилятор обрабатывает тело каждой функции-члена, имеющей одну или несколько переменных без начального значения. Для каждой переменной v без начального значения компилятор определяет состояние определенного присваивания для v в каждой из следующих точек функции-члена:

  • В начале каждого оператора

  • В конечной точке каждого оператора (§8.1)

  • В каждой ветке, где управление передается в другой оператор или в конечную точку оператора

  • В начале каждого выражения

  • В конце каждого выражения

Состояние определенного присваивания переменной v может иметь одно из следующих значений:

  • С определенным присваиванием. Указывает, что во всех возможных потоках управления в эту точку переменной v было присвоено значение.

  • Без определенного присваивания. Состояние переменной без определенного присваивания в конце выражения с типом bool может (но не должно) иметь одно из следующих значений дополнительного состояния:

  • Определенно присвоенная после выполнения выражения с итогом true. Это состояние указывает, что переменная v является определенно присвоенной, если в результате выполнения логического выражения было получено значение true, однако может не являться присвоенной, если в результате выполнения логического выражения было получено значение false.

  • Определенно присвоенная после выполнения выражения с итогом false. Это состояние указывает, что переменная v является определенно присвоенной, если в результате выполнения логического выражения было получено значение false, однако может не являться присвоенной, если в результате выполнения логического выражения было получено значение true.

Определение состояния переменной v в каждой из точек управляется указанными ниже правилами.

5.3.3.1Общие правила для операторов

  • Переменная v не является определенно присвоенной в начале тела функции-члена.

  • Переменная v является определенно присвоенной в начале каждой недостижимого оператора.

  • Состояние определенного присваивания переменной v в начале каждого другого оператора определяется путем проверки состояния определенного присваивания переменной v во всех ветвлениях потоков управления, ведущих к началу этого оператора. Только в том случае, если переменная v является определенно присвоенной во всех таких ветвлениях потоков управления, эта переменная считается определенно присвоенной в начале оператора. Набор возможных ветвлений потоков управления определяется точно так же, как и при проверке достижимости операторов (§8.1).

  • Состояние определенного присваивания переменной v в конечной точке блока или операторов checked, unchecked, if, while, do, for, foreach, lock, using или switch определяется путем проверки состояния определенного присваивания переменной v во всех ветвях потоков управления, ведущих к конечной точке этого оператора. Если переменная v является определенно присвоенной во всех ветвях потоков управления, эта переменная считается определенно присвоенной в конечной точке оператора. В обратном случае переменная v не является определенно присвоенной в конечной точке оператора. Набор возможных ветвлений потоков управления определяется точно так же, как и при проверке достижимости операторов (§8.1).

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