如果在using语句中发生异常,对象是否仍然会被处理?

65

如果在使用语句中发生异常,对象是否仍会被处理?

我之所以问这个问题,是因为我正在考虑是在整个代码块周围放置try-catch还是在内部using语句中放置。请注意,某些异常在catch块中被设计为重新抛出。

using (SPSite spSite = new SPSite(url))
{
   // Get the Web
   using (SPWeb spWeb = spSite.OpenWeb())
   {
       // Exception occurs here
   }
}
4个回答

68

是的,它们会。

using(SPWeb spWeb = spSite.OpenWeb())
{
  // Some Code
}

等同于

{
  SPWeb spWeb = spSite.OpenWeb();
  try
  {

    // Some Code
  }
  finally
  {
    if (spWeb != null)
    {
       spWeb.Dispose();
    }
  }
}

编辑

回答完这个问题后,我在我的博客上撰写了一篇更深入的关于IDisposable和Using构造的文章。


11

是的。使用using语句大致翻译为以下结构:

IDisposable x;
try
{
    ...
}
finally
{
    x.Dispose();
}

6
是的,它确实可以。就像在 try-finally 中包装您的代码一样(并在 finally 中处置)。

2
< p >使用using语句会导致完整且正确的dispose模式生成,所以答案是肯定的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接