Using statement with try catch. What happens to instance from using statement?
-
29-06-2021 - |
Question
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
.
OTHER TIPS
we assume Foo() fails and the exception is fired and effectively breaks the program will databaseConnectivityObject be disposed?
Yes it will be. using internally uses try-finally
, (using only works for those which implements IDisposable
)
The using statement ensures that Dispose is called even if an exception occurs while you are calling methods on the object. You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using statement is translated by the compiler.
Yes your using
block will dispose of the databaseConnectivityObject, irrespective of whether you have a try - catch block.
You rightly say that the using block is important and you should use it for all classes that implement IDisposable
to ensure that they get disposed of properly even in the event of an exception.
The using statement ensures that Dispose is called even if an exception occurs while you are calling methods on the object. You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using statement is translated by the compiler.
When implementing the using
block the object in the parentheses will be disposed if it implements the IDisposable
interface.
It would still be disposed even if foo()
failed.
The object inside the using statement must implement the IDisposable
interface.
Also, these questions "Uses of using in c sharp" and "using statement vs try finally" speak further on the uses and practicalities of the using
statement.
Section 8.13 of the C# Language Specification details the using statement clearly.
Your using
code is equivalent to
IDatabaseConnectivityObject databaseConnectivityObject = new IDatabaseConnectivityObject ();
try
{
//To do code here
}
finally
{
if(databaseConnectivityObject!=null)
{
databaseConnectivityObject.Dispose();
}
}
A using statement mainly categorized into three part i.e.
- Acquisition
- Usage
- Disposal
Firstly, the resources is acquired and the usage is made on the try block with finally statement.At last, the object is disposed in finally block as given in above equivalent code....