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

问题描述 投票:22回答:3

using语句是否总是处置该对象,即使有一个返回或异常被抛入其中?即:

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

要么

using (var myClassInstance = new MyClass())
{
    // ...
    throw new UnexplainedAndAnnoyingException();
}
c# dispose using using-statement
3个回答
32
投票

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

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

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


10
投票

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

从MSDN使用Statement(C#Reference)

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

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


4
投票

不,不。

但这不是using声明的错。这是因为CLR如何处理finally块。在某些情况下,finally块将无法执行。如果你有一个未处理的异常,并且如果CLR认为执行更多代码会导致更多错误,那么它将不执行Dispose方法(因为它不会执行finally方法被编译为Dispose块)。因此,要非常小心,不要把你的生命投入到Dispose方法的执行中。

可导致Dispose方法未被执行的其他情况可列为:

  • Environment.FailFast
  • OutOfMemoryExceptionand StackOverflowException
  • 杀死这个过程
  • 电力流失
© www.soinside.com 2019 - 2024. All rights reserved.