“using”语句是否始终处置对象?

时间:2013-06-28 04:36:56

标签: c# dispose using using-statement

using语句是否始终处置该对象,即使有返回或异常被抛出?即:

using (var myClassInstance = new MyClass())
{
    // ...
    return;
}

using (var myClassInstance = new MyClass())
{
    // ...
    throw new UnexplainedAndAnnoyingException();
}

3 个答案:

答案 0 :(得分:32)

是的,这就是重点。它编译为:

SomeDisposableType obj = new SomeDisposableType();
try
{
    // use obj
}
finally
{
    if (obj != null) 
        ((IDisposable)obj).Dispose();
}

这里要小心你的术语;对象本身未被释放。调用Dispose()方法,通常会释放非托管资源。

答案 1 :(得分:10)

如果对象实现了IDisposable,则会调用它。

使用MSDN的声明(C#参考)

  

定义一个范围,一个或多个对象将在该范围之外   地布置。

     

using语句允许程序员指定对象的时间   使用资源应该释放它们。提供给使用的对象   语句必须实现IDisposable接口。这个界面   提供Dispose方法,该方法应该释放对象   资源。

答案 2 :(得分:4)

不,不是。

但这不是using语句的 fault 。这是因为CLR如何处理finally块。在某些情况下,finally块将不会执行。如果您有未处理的异常,并且CLR 认为执行更多的代码会导致更多的错误,则它将不会执行Dispose方法(因为它将不会执行finally Dispose方法被编译为..因此,请非常小心,不要将生命投入到执行Dispose方法中。

其他可能导致Dispose方法无法执行的情况可以列为: