Search code examples
c#.netusing-statement

Using statement with try catch. What happens to instance from using statement?


If I have a using block surrounding a try catch statement what will happen to the object inside that using statement should the catch fire an exception? Consider the following code:

using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse())
{
    try
    {
        Foo();
    }
    catch (ArgumentNullException e)
    {
        throw;
    }
}

If we assume Foo() fails and the exception is fired and effectively breaks the program will databaseConnectivityObject be disposed? The reason this is important is that the object has a database connection associated with it.


Solution

  • You can think of using as a short-hand for try-finally. Hence your code is equivalent to:

    IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse();
    try
    {
        try
        {
            Foo();
        }
        catch(ArgumentNullException e)
        {
            throw;
        }
    }
    finally
    {
      if(databaseConnectivityObject != null)//this test is often optimised away
        databaseConnectivityObject.Dispose()
    }
    

    Looked at this way, you can see that the Dispose() will indeed be called if the exception throws, because the try-finally is outside of the try-catch.

    This is precisely why we use using.