所有一次性物体是否在使用区块内实例化?

时间:2010-02-17 22:34:57

标签: c# vb.net dispose using-statement

这是我过去多次问自己的一个问题,因为我使用语句5深度嵌套。

阅读docs并且没有提及关于在块中实例化的其他一次性用品的方式,我认为它对于SO档案来说是一个很好的Q.

考虑一下:

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

// is conn2 disposed?

7 个答案:

答案 0 :(得分:14)

不,他们不是。只会自动处理using子句中明确列出的变量集。

答案 1 :(得分:6)

显然我有答案......; - )

答案是否定的。只处理使用声明中的对象

[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
}

答案 2 :(得分:4)

如果您想要使用using语句的确切规则,请参阅规范的第8.13节。你的所有问题都应该在那里清楚地回答。

答案 3 :(得分:2)

不,它不起作用,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并不是什么大问题。

答案 4 :(得分:1)

没有。使用会导致处理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...
}

答案 5 :(得分:0)

没有。使用ILDASM或Reflector检查生成的IL。

答案 6 :(得分:0)

只会处理using()中的变量,而不是实际的代码块。