当从'using'块中调用'return'时会发生什么?

时间:2010-02-17 22:06:17

标签: c# idisposable using-statement

如果我有一个像这样的使用块的方法......

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

...从using块中返回值,IDisposable对象是否仍处理掉?

2 个答案:

答案 0 :(得分:29)

是的。对象的处理发生在finally块中,该块甚至在返回调用的情况下也执行。它基本上扩展为以下代码

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

答案 1 :(得分:7)

来自the MSDN documentation

  

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

所以对象总是处理好的。除非你插上电源线。