【问题标题】:Does "using" statement always dispose the object?“使用”语句是否总是处理对象?
【发布时间】:2013-06-25 18:53:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# dispose using using-statement


    【解决方案1】:

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

    来自 MSDN 的 using 语句(C# 参考)

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 在某些情况下,finally 块不会按照我的回答中的说明执行。
      【解决方案3】:

      不,它没有。

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

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

      【讨论】:

      • Power loss ... 真的吗?
      • 真的。例如,电力不会等待一个实施不当的Dispose 方法完成将持久层保持在良好状态。
      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多