【问题标题】:What happens when 'return' is called from within a 'using' block? [duplicate]当从“使用”块中调用“返回”时会发生什么? [复制]
【发布时间】:2011-01-18 02:10:48
【问题描述】:

如果我有这样一个 using 块的方法...

    public IEnumerable<Person> GetPersons()
    {
        using (var context = new linqAssignmentsDataContext())
        {
            return context.Persons.Where(p => p.LastName.Contans("dahl"));
        }
    }

...从 using 块中返回值,IDisposable 对象是否仍然被释放?

【问题讨论】:

标签: c# idisposable using-statement


【解决方案1】:

来自the MSDN documentation

using 语句可确保调用 Dispose,即使在您调用对象上的方法时发生异常也是如此。您可以通过将对象放在 try 块中,然后在 finally 块中调用 Dispose 来获得相同的结果;事实上,编译器就是这样翻译 using 语句的。

所以对象总是被释放。除非你拔掉电源线。

【讨论】:

  • “所以物体总是被丢弃。除非你拔掉电源线。” - 在这种情况下,物体会随着电子分散而被放置;-)
  • 提醒我这篇 TheDailyWTF 文章(第一篇):thedailywtf.com/Articles/My-Tales.aspx
  • 调用 Environment.FailFast 也不会调用 Dispose 除了拔掉电源线。
  • Robert Davis:在 .NET 中,堆栈溢出也会关闭进程,而不执行 finally 块。
  • 是的,这只是一个例子。到我写这个答案的时候,我也想到了 TheDailyWTF 的文章……;)
【解决方案2】:

是的。对象的处置发生在 finally 块中,即使在面对返回调用时也会执行。它基本上扩展为以下代码

var context = new linqAssignmentsDataContext();
try {
  return context.Persons.Where(p => p.LastName.Contans("dahl"));
} finally {
  if ( context != null ) {
    context.Dispose();
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多