【问题标题】:Are resources disposed even if an exception is thrown in a using block? [duplicate]即使在 using 块中抛出异常,资源是否也会被释放? [复制]
【发布时间】:2012-01-04 17:25:14
【问题描述】:

可能重复:
Does Dispose method still get called when Exception is thrown inside of Using statment?

在访问数据库时,我有许多 using 块。我想知道 - 如果必须在 using 块内引发异常,即使未到达块的末尾,是否仍会释放必要的资源?还是我需要在 catch 块中自己手动关闭它们?

【问题讨论】:

    标签: c# asp.net .net exception-handling using-statement


    【解决方案1】:

    使用using 语句定义的资源已被释放,这是using 有好处的主要原因。

    using 语句确保 Dispose 被调用 即使 当您在对象上调用方法时发生异常。你可以 通过将对象放在 try 块中来实现相同的结果,然后 然后在 finally 块中调用 Dispose;事实上,这就是 using 语句由编译器翻译。
    http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx

    【讨论】:

    • +1 表示链接到描述并且是 15 秒。比我快。 ;-)
    • 谢谢!只是等待计时器接受答案:)
    【解决方案2】:

    是的,使用块的资源将被释放。

    【讨论】:

      【解决方案3】:

      你不会的。实际上,如果您在 finally 块中使用 try{}catch{}finally{} 构造和 Dispose 方法调用,using 块是相同的。所以无论如何它都会被调用。

      【讨论】:

        【解决方案4】:

        是的,该元素将被释放,因为调用是 tryfinally 块的一部分,using 将转换为该块。

        从 C# 规范的 8.13 开始:

        一个using语句被翻译成三部分:获取、使用、 和处置。资源的使用隐式包含在 try 包含 finally 子句的语句。这个 finally 子句处理 的资源。如果获取了空资源,则不调用 进行了 Dispose,没有抛出异常。

        所以你不需要手动处理它,而且我不确定在这种情况下你自己的 catch 块在哪里。

        【讨论】:

          猜你喜欢
          • 2013-10-16
          • 2010-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-08
          • 2016-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多