Существует две формы using
операторов, определенных в спецификации C #:
using-statement:
using ( resource-acquisition ) embedded-statement
resource-acquisition:
local-variable-declaration
expression
Если у вас есть local-variable-declaration
, вопросов не будет. Переменная будет доступна только для чтения в блоке using, и вы вообще не сможете ее изменить. В спецификации сказано:
8.13 Оператор использования
[...] В любом расширении переменная ресурса доступна только для чтения во встроенном операторе.
Здесь мы имеем дело со второй формой: где resource-acquisition
равно expression
, а не local-variable-declaration
. В этом случае спецификация C # ясно говорит:
Использование оператора формы
using (expression) statement
имеет те же два возможных расширения, но в этом случае ResourceType неявно является типом выражения времени компиляции, а переменная ресурса недоступна и невидима для встроенного оператора . [Акцент мой]
Очевидно, что вы не можете изменить невидимую, недоступную переменную. Его значение присваивается только в условии использования resource-acquisition
. Следовательно, оно будет иметь старое значение переменной, а не новое.
Когда вы имеете дело с присвоением уже объявленной переменной , вы используете эту форму оператора using
. Тот факт, что вы присваиваете значение переменной , как
using ( x = something )
не имеет значения. Целое x = something
рассматривается как выражение, и значение имеет только значение этого выражения. Важно знать, что «переменная ресурса» здесь не «х». Это невидимая переменная. С точки зрения компилятора, нет большой разницы между следующими конструкциями:
using ( something )
using ( x = something )
using ( y = x = something )
Во всех случаях выражение будет выполнено, и значение - это то, что получит гарантированное удаление, а не переменная. Что должен делать компилятор, если это не определенное поведение и вы написали третью строку в приведенном выше блоке? Утилизировать x
? y
? и то и другое? ни? Текущее поведение имеет смысл.