Using语句和IDisposable接口

本文关键字:接口 IDisposable 语句 Using | 更新日期: 2023-09-27 18:25:26

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

我需要做什么:

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

还是这就足够了,"bar"answers"foo"一起处理?

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

Using语句和IDisposable接口

还是这就足够了,"bar"answers"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处于未处置状态。

要用using语句同时处理它们,您不必嵌套它们,但是您可以编写这个

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

作为

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

}

在第二个版本中,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
}