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

Gui*_*rez 23 c# dispose using using-statement

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

using (var myClassInstance = new MyClass())
{
    // ...
    return;
}
Run Code Online (Sandbox Code Playgroud)

要么

using (var myClassInstance = new MyClass())
{
    // ...
    throw new UnexplainedAndAnnoyingException();
}
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 32

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

SomeDisposableType obj = new SomeDisposableType();
try
{
    // use obj
}
finally
{
    if (obj != null) 
        ((IDisposable)obj).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

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


Adr*_*der 10

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

从MSDN使用Statement(C#Reference)

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

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


sot*_*otn 6

不,不是。

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

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

  • 环境失败

  • OutOfMemoryExceptionStackOverflowException

  • 杀死进程

  • 电力流失

  • “断电”……真的吗? (4认同)
  • @马拉特[是的。断电。](https://thedailywtf.com/articles/My-Tales) :) (3认同)