4

在 using 语句中声明的变量是否因为在 using 块的范围内而被一起处理?

我需要做:

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
    using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
    {

    }
}

或者这是否就足够了,“bar”是否与“foo”一起放置?

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
    SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
}
4

3 回答 3

11

或者这是否就足够了,“bar”是否与“foo”一起放置?

不,酒吧不会被处置。

using语句转换为try-finally块,因此即使发生异常,finally块也可以确保对Dispose方法的调用。

下列的

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
    SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
}

翻译成

{
    SomeIdisposableImplementation foo;
    try
    {
        foo = new SomeIdisposableImplementation();
        SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
    }
    finally
    {
        if (foo != null)
            foo.Dispose();
    }
}

留下bar未处置。

于 2013-07-29T15:36:18.403 回答
4

要使它们都与 using 语句一起处理,您不必嵌套它们,但是您可以编写此代码

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
    using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
    {

    }
}

作为

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
{


}
于 2013-07-29T15:41:02.830 回答
1

在第二个版本中 bar 将超出范围但不会被释放。但是您可以使用命令将 foo 和 bar 放在同一个中:

using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation(), SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
{
    // use foo and bar
}

您也可以将变量放入 using 命令中:

SomeIdisposableImplementation foo = new SomeIdisposableImplementation();
SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
using (foo, bar)
{
    // use foo and bar
}
于 2013-07-29T15:39:47.667 回答