【问题标题】:Will a IDisposable be disposed if the using block returns?如果 using 块返回,是否会处置 IDisposable?
【发布时间】:2011-09-15 10:12:54
【问题描述】:

例如

using(var something = GetSomething())
{
    something.DoSomething();
    if(something.IsX()) return true;
}
return false;

【问题讨论】:

  • 嗯,这很有趣,您正在执行 GetSomething() 而不是 New Something。我不认为该框架具有区分差异的智能。如果Something 是单例,则退出后可能会出现“DisposedObject”异常。您可以构建一个小型测试应用程序来了解框架对 Using(GetSomething()) 的作用。

标签: c# .net return idisposable using


【解决方案1】:

还没有提到的一点是,虽然“使用”块中的“返回”将调用受控变量的 Dispose,但迭代器中的“使用”块中的“收益返回”不会释放受控变量除非与迭代器关联的 IEnumerator 是 Disposed。

【讨论】:

    【解决方案2】:

    是的,当然。 Dispose 方法被调用,但是 using 语句被执行,除非它是一个突然的全进程终止。最常见的情况是:

    • 区块内的return
    • 块内抛出(但未被捕获)异常
    • 自然到达方块的尽头

    基本上,using 语句主要是 try/finally 块的语法糖 - 并且 finally 具有所有相同的属性。

    编辑:来自C# 4 specification 的第 8.13 节:

    using 语句被翻译成三个部分:获取、使用和处置。资源的使用隐式包含在包含finally 子句的try 语句中。这个finally 子句处理资源。

    finally 语句在规范的第 8.10 节中描述:

    finally 块的语句总是在控制离开try 语句时执行。无论控制转移是否是正常执行的结果,都是如此;作为执行breakcontinuegotoreturn 语句的结果;或者由于在try 语句中传播异常。

    【讨论】:

    • 我知道你是 Jon Skeet,但你能引用一个参考吗? :)
    • @Louis:不可能 - 所有文档都引用 Jon Skeet。
    • @Florian:我已经用规范中最相关的引用覆盖了您的编辑。 OP 可以阅读规范以获取更多详细信息。
    • @Louis:我添加了规范中的引号。希望这能解决问题。
    【解决方案3】:

    是的。

    using is syntactic sugar for a try/finally block:

    using 语句确保 即使出现异常也会调用 Dispose 在您调用方法时发生 物体上。你可以实现 通过放置对象获得相同的结果 在 try 块内,然后调用 在 finally 块中处理;

    In the documentation on the finally block:

    而 catch 用于处理 语句中出现的异常 块,finally 用于保证一个 语句块代码执行 不管前面怎么尝试 块已退出。

    因此,using 被转换为 try/finally.Dispose()finally 部分中,确保无论在 try/catch 中发生什么,它总是被执行。

    【讨论】:

      【解决方案4】:

      是的,using 是一个编译器特性,它扩展为

      try {
        ...
        return ...;
      }
      finally {
        foo.Dispose();
      }
      

      【讨论】:

        【解决方案5】:

        我认为一旦控制退出{} dispose 就会被调用所以简而言之Yes

        【讨论】:

          【解决方案6】:

          据我所知,using 块将在对象退出范围后立即处理它。

          例如,当返回 true 时,下一条语句超出范围,因此该变量将被释放。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多