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

5.1.6Выходные параметры

Параметр, объявленный с модификатором out, является выходным параметром.

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

В отношении выходных параметров применяются указанные ниже правила определенного присваивания. Обратите внимание на разные правила для выходных параметров, описанные в §5.1.5.

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

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

  • В функции-члене или анонимной функции выходной параметр считается не имеющим начального значения.

  • Каждый выходной параметр функции-члена или анонимной функции должен быть определенно присвоен (§5.3) перед нормальным завершением выполнения такой функции-члена или анонимной функции.

В конструкторе экземпляра с типом struct ключевое слово this имеет точно такое же поведение, как выходной параметр с типом struct (§7.6.7).

5.1.7Локальные переменные

Локальная переменная объявляется с использованием объявления_локальной_переменной, которое может находиться в блоке, операторе_for, операторе_switch или операторе_using, а также при помощи оператора_foreach или конкретной_конструкции_catch в операторе_try.

Время жизни локальной переменной соответствует части выполнения программы, в которой для нее гарантированно резервируется место. Это время жизни длится по меньшей мере с момента входа в блок, операторы for, switch, using, foreach или конкретную_конструцию_catch, с которой связана данная переменная, до завершения выполнения этого блока, операторов for, switch, using, foreach или конкретной_конструкции_catch любым из способов. (Вход во вложенный блок или вызов метода приостанавливает, но не завершает выполнение текущих блока, операторов for, switch, using, foreach или конкретной_конструкции_catch.) Если локальная переменная перехватывается анонимной функцией (§7.15.5.1), ее время жизни увеличивается по крайней мере на период времени, в течение которого делегат или дерево выражений, созданные в этой анонимной функции, а также другие объекты, ссылающиеся на перехваченную переменную, станут доступны для сбора мусора.

Если вход в родительский блок, оператор for, switch, using, foreach или конкретную_конструкцию_catch выполняется рекурсивно, каждый раз создается новый экземпляр локальной переменной, при этом каждый раз вычисляется инициализатор_локальной_переменной (при его наличии).

Локальная переменная, созданная с использованием объявления_локальной_переменной, не инициализируется автоматически и поэтому не имеет значения по умолчанию. Для целей проверки определенного присваивания локальная переменная, созданная с использованием объявления_локальной_переменной, считается не имеющей начального значения. Объявление_локальной_переменной может содержать инициализатор_локальной_переменной. В этом случае переменная считается определенно присвоенной только после инициализирующего выражения (§5.3.3.4).

В области действия локальной переменной, созданной с использованием объявления_локальной_переменной, ссылка на эту локальную переменную из фрагмента программы, предшествующего в тексте объявлению_локальной_переменной, приведет к ошибке компиляции. Если объявление локальной переменной выполнено неявно (§8.5.1), ссылка на эту переменную в ее объявлении_локальной_переменной также вызовет ошибку.

Локальная переменная, созданная с использованием оператора_foreach или конкретной_конструкции_catch, считается определенно присвоенной по всей области действия.

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

Место хранения, на которое ссылается локальная ссылочная переменная, освобождается без учета времени жизни этой ссылочной переменной (§3.9).

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