10

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

阅读文档并发现没有提及关于块内实例化的其他一次性用品的任何一种方式,我认为这是 SO 档案的一个很好的 Q。

考虑一下:

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

// is conn2 disposed?
4

7 回答 7

15

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

于 2010-02-17T22:35:57.333 回答
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
}
于 2010-02-17T22:35:48.127 回答
4

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

于 2010-02-17T22:41:53.217 回答
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并不是什么大问题。

于 2012-11-29T08:40:25.667 回答
1

不会。 Using 会导致 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...
}
于 2010-02-17T22:37:57.043 回答
0

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

于 2010-02-17T22:35:48.223 回答
0

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

于 2010-02-17T22:37:51.070 回答