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

5.2Значения по умолчанию

Указанные ниже категории переменных автоматически инициализируются соответствующими значениями по умолчанию.

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

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

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

Значение по умолчанию для переменной зависит от типа переменной и определяется следующим образом:

  • Для переменной с типом_передаваемым_по_значению, значение по умолчанию равно значению, вычисленному конструктором по умолчанию для типа_передаваемого_по_значению (§4.1.2).

  • Для переменной со ссылочным_типом значением по умолчанию является null.

При инициализации значениями по умолчанию, как правило, диспетчер памяти или сборщик мусора перед выделением области памяти инициализирует все ее биты нулями. По этой причине пустую ссылку удобно представить как область памяти, все биты которой равны нулю.

5.3Определенное присваивание

В конкретной позиции исполняемого кода функции-члена переменная считается определенно присвоенной, если в результате отдельного статического анализа потока (§5.3.3) компилятор выявляет, что эта переменная была автоматически инициализирована или стала целевым объектом по меньшей мере одного присваивания. Другими словами, действуют следующие правила определенного присваивания:

  • Переменная с начальным значением (§5.3.1) всегда считается определенно присвоенной.

  • Переменная без начального значения (§5.3.2) считается определенно присвоенной в указанном расположении, если все возможные пути выполнения, ведущие в это расположение, содержат по меньшей мере одну из следующих операций:

  • Простое присваивание (§7.17.1), в котором переменная является левым операндом.

  • Выражение вызова (§7.6.5) или выражение создания объекта (§7.6.10.1), передающее переменную в качестве выходного параметра.

  • Для локальной переменной — объявление локальной переменной (§8.5.1), включающее инициализатор переменной.

Формальная спецификация, определяющая изложенные выше правила, описана в §5.3.1, §5.3.2 и §5.3.3.

Определенное присваивание для переменных экземпляра переменной с типом_struct отслеживаются как по отдельности, так и в совокупности. В дополнение к изложенным выше правилам в отношении переменных с типом_struct и их переменных экземпляра применяются следующие правила:

  • Переменная экземпляра считается определенно присвоенной, если содержащая ее переменная с типом_struct считается определенно присвоенной.

  • Переменная с типом_struct считается определенно присвоенной, если каждая из ее переменных экземпляра считается определенно присвоенной.

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

  • Переменная должна быть определенно присвоена в каждом месте, где извлекается ее значение. Это обеспечивает отсутствие неопределенных значений. Включение переменной в выражение считается извлечением значения этой переменной за исключением следующих случаев:

  • переменная является левым операндом выражения простого присваивания,

  • переменная передается в качестве выходного параметра, или

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

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

  • Все выходные параметры функции-члена должны быть определенно присвоены в каждой точке, где выполняется возврат из функции-члена (при помощи оператора return или в результате достижения конца тела функции-члена). Это гарантирует, что функции-члены не будут возвращать в выходных параметрах неопределенные значения, что позволяет компилятору обработать вызов функции-члена, принимающей переменную в качестве выходного параметра, как выполнение присваивания в отношении этой переменной.

  • Переменная this конструктора экземпляра переменной с типом_struct должна быть определенно присвоена в каждой точке, где выполняется возврат из этого конструктора экземпляра.

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