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

Sky*_*ers 10 c# vb.net dispose using-statement

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

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

考虑一下:

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

// is conn2 disposed?
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 15

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


Sky*_*ers 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
}
Run Code Online (Sandbox Code Playgroud)