Созданы ли все одноразовые предметы внутри использованного блока? - PullRequest
9 голосов
/ 18 февраля 2010

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

Прочитав документы и не найдя ни одного упоминания в отношении других одноразовых принадлежностей, созданных в блоке, я решил, что это хороший вопрос для архивов SO.

Учтите это:

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

// is conn2 disposed?

Ответы [ 7 ]

14 голосов
/ 18 февраля 2010

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

6 голосов
/ 18 февраля 2010

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

Ответ - нет. Только объекты в объявлении об использовании располагаются

[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
}
4 голосов
/ 18 февраля 2010

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

2 голосов
/ 29 ноября 2012

Нет, это не работает, conn2 не будет утилизироваться. Обратите внимание, что кратные значения using являются единственной ситуацией, когда я разрешаю не использовать скобки для большей ответственности:

        using (var pen = new Pen(color, 1))
        using (var brush = new SolidBrush(color))
        using (var fontM60 = new Font("Arial", 15F, FontStyle.Bold, GraphicsUnit.Pixel))
        using (var fontM30 = new Font("Arial", 12F, FontStyle.Bold, GraphicsUnit.Pixel))
        using (var fontM15 = new Font("Arial", 12F, FontStyle.Regular, GraphicsUnit.Pixel))
        using (var fontM05 = new Font("Arial", 10F, FontStyle.Regular, GraphicsUnit.Pixel))
        using (var fontM01 = new Font("Arial", 8F, FontStyle.Regular, GraphicsUnit.Pixel))
        using (var stringFormat = new StringFormat())
        {
        }

Таким образом, вложенные using не имеют большого значения.

1 голос
/ 18 февраля 2010

Нет. Использование приводит к удалению объекта в операторе 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...
}
0 голосов
/ 18 февраля 2010

Будут расположены только переменные внутри using(), а не фактический блок кода .

0 голосов
/ 18 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...