If an Exception happens within a using statement does the object still get disposed?

C#Exception HandlingTry CatchUsing

C# Problem Overview


If an Exception happens within a using statement does the object still get disposed?

The reason why I'm asking is because I'm trying to decide on whether to put a try caught around the whole code block or within the inner using statement. Bearing in mind certain exceptions are being re-thrown by design within the catch block.

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

C# Solutions


Solution 1 - C#

Yes, they will.

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

is equivalent to

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

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

###Edit### After answering this question, I wrote a more in depth post about the IDisposable and Using construct in my blog.

Solution 2 - C#

Yes. A using statement translates to approximately the following construct:

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

Solution 3 - C#

Yes it does. It's like wrapping your code in a try-finally (and disposing in the finally).

Solution 4 - C#

The using statement causes a complete and proper dispose pattern to be generated, so the answer is yes.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndrewView Question on Stackoverflow
Solution 1 - C#Anders AbelView Answer on Stackoverflow
Solution 2 - C#spenderView Answer on Stackoverflow
Solution 3 - C#Phil LambertView Answer on Stackoverflow
Solution 4 - C#OdedView Answer on Stackoverflow