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

问题描述 投票:0回答:5

如果在 using 语句中发生异常,该对象是否仍会被释放?

我问的原因是因为我试图决定是在整个代码块周围还是在内部 using 语句中放置 try catch 。请记住,catch 块中的设计会重新引发某些异常。

using (SPSite spSite = new SPSite(url))
{
   // Get the Web
   using (SPWeb spWeb = spSite.OpenWeb())
   {
       // Exception occurs here
   }
}
c# exception try-catch using
5个回答
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
投票

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


0
投票

这两个对象都不会被丢弃。检查下面的小提琴。

https://dotnetfiddle.net/RhgMm1

© www.soinside.com 2019 - 2024. All rights reserved.