Это - вопрос, который я задавал сам много раз в прошлом, когда я вложил операторы использования 5 глубоко.
Читая документы и не находя упоминание так или иначе относительно другого disposables инстанцированным в блоке, который я решил, это был хороший Q для ТАК архивов.
Рассмотрите это:
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
}
// is conn2 disposed?
Очевидно, у меня есть ответ... ;-)
Ответ - нет. Утилизируются только объекты в объявлении using
[Test]
public void TestUsing()
{
bool innerDisposed = false;
using (var conn = new SqlConnection())
{
var conn2 = new SqlConnection();
conn2.Disposed += (sender, e) => { innerDisposed = true; };
}
Assert.False(innerDisposed); // not disposed
}
[Test]
public void TestUsing2()
{
bool innerDisposed = false;
using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
{
conn2.Disposed += (sender, e) => { innerDisposed = true; };
}
Assert.True(innerDisposed); // disposed, of course
}
Нет, это не так. Только набор переменных, явно перечисленных в предложении using, будет автоматически удален.
Если вам нужны точные правила для оператора using, обратитесь к разделу 8.13 спецификации. Там должны быть четкие ответы на все ваши вопросы.
Нет. Использование вызывает удаление объекта в операторе using. Если вы хотите, чтобы оба объекта были удалены, вам следует переписать это как:
using (var conn = new SqlConnection())
{
using (var conn2 = new SqlConnection())
{
// use both connections here...
}
}
Или, в качестве альтернативы, вы можете использовать более сжатый синтаксис:
using (SqlConnection conn = new SqlConnection(), conn2 = new SqlConnection())
{
// use both connections here...
}
Нет. Проверьте сгенерированный IL с помощью ILDASM или Reflector.
Только переменные в , использующие ()
, будут удалены, а не фактический блок кода.
.