Все доступные объекты инстанцируют в расположенном блоке использования?

Это - вопрос, который я задавал сам много раз в прошлом, когда я вложил операторы использования 5 глубоко.

Читая документы и не находя упоминание так или иначе относительно другого disposables инстанцированным в блоке, который я решил, это был хороший Q для ТАК архивов.

Рассмотрите это:

using (var conn = new SqlConnection())
{
    var conn2 = new SqlConnection();
}

// is conn2 disposed?

10
задан Sky Sanders 17 February 2010 в 22:34
поделиться

6 ответов

Очевидно, у меня есть ответ... ;-)

Ответ - нет. Утилизируются только объекты в объявлении 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
}
6
ответ дан 3 December 2019 в 15:35
поделиться

Нет, это не так. Только набор переменных, явно перечисленных в предложении using, будет автоматически удален.

15
ответ дан 3 December 2019 в 15:35
поделиться

Если вам нужны точные правила для оператора using, обратитесь к разделу 8.13 спецификации. Там должны быть четкие ответы на все ваши вопросы.

4
ответ дан 3 December 2019 в 15:35
поделиться

Нет. Использование вызывает удаление объекта в операторе 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...
}
1
ответ дан 3 December 2019 в 15:35
поделиться

Нет. Проверьте сгенерированный IL с помощью ILDASM или Reflector.

0
ответ дан 3 December 2019 в 15:35
поделиться

Только переменные в , использующие () , будут удалены, а не фактический блок кода. .

0
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: