Да, абсолютно.Подробности в разделе 8.13.Нет точного изложения вашего точного вопроса, но:
Оператор использования вида
using (expression) statement
имеет те же три возможных расширения, но в этом случае ResourceType
неявно является типом выражения времени компиляции, а переменная ресурса недоступна и невидима для встроенного оператора.
«Три возможных расширения», о которых идет речь, охватывают более распространенноеслучай объявления переменной одновременно.В основном важно то, что он ведет себя одинаково, за исключением области видимости переменной.Dispose
будет по-прежнему вызываться - в противном случае не было бы никакого смысла вставлять оператор using
вообще:)
Обратите внимание, что эти два значения не являются вполне эквивалентнымитого, что является допустимым в блоке, потому что переменная, объявленная оператором using
, доступна только для чтения.Так что это действительно:
// Warning but no error
MemoryStream ms = new MemoryStream();
using (ms)
{
ms = null;
}
, но это не так:
using (MemoryStream ms = new MemoryStream())
{
// error CS1656: Cannot assign to 'ms' because it is a 'using variable'
ms = null;
}
Обратите внимание, что даже в случае, если оно действительно, это оригинальное значениеms
который используется для утилизации.Компилятор проясняет это:
предупреждение CS0728: Возможно, неправильное присвоение локальной переменной «ms», которая является аргументом оператора using или lock.Вызов или разблокировка Dispose произойдет с исходным локальным значением.
Обратите внимание, что эта форма не генерирует предупреждение:
// No warning
MemoryStream ms;
using (ms = new MemoryStream())
{
ms = null;
}
С другой стороны, кроме этого, они действительно будут вести себя одинаково.
РЕДАКТИРОВАТЬ: Как отмечает bzlm, тот факт, что переменная остается в области видимости после оператора using
, означает, что обычно не очень хорошая идея.Тем не менее, объекты, которые были удалены, не всегда непригодны для использования.Например:
MemoryStream ms = new MemoryStream();
using (ms)
{
// Do stuff
}
byte[] data = ms.ToArray();
Это будет прекрасно работать - MemoryStream
сохраняет данные, даже когда они утилизируются.Мне все еще кажется, что это неправильно.