32

语句是否using总是处理对象,即使其中有返回或抛出异常?IE:

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

或者

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

3 回答 3

41

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

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

请注意这里的术语;对象本身没有被释放。调用该Dispose()方法,通常会释放非托管资源。

于 2013-06-28T04:38:21.623 回答
11

不,它没有。

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

其他可能导致Dispose方法不被执行的情况可以列举如下:

  • 环境.FailFast

  • OutOfMemoryExceptionStackOverflowException

  • 杀死进程

  • 电力流失

于 2018-07-13T08:47:10.850 回答
10

如果对象实现了 IDisposable,它将被调用。

来自 MSDN 的 using Statement (C# Reference)

定义一个范围,一个或多个对象将被释放到该范围之外。

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

于 2013-06-28T04:38:19.657 回答