Suppose I have the following:
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
Why not just do the following and lose a couple of curly braces?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
Thanks for the advice!
Rule#1: Properly dispose of classes that implement IDisposable. The first rule is whenever you are consuming a class that implements the IDisposable interface; you should call the “Dispose” method when you are done with that class.
IDisposable is usually used when a class has some expensive or unmanaged resources allocated which need to be released after their usage. Not disposing an object can lead to memory leaks.
The Dispose() methodThe Dispose method performs all object cleanup, so the garbage collector no longer needs to call the objects' Object. Finalize override. Therefore, the call to the SuppressFinalize method prevents the garbage collector from running the finalizer. If the type has no finalizer, the call to GC.
Answer: None. Calling Dispose can release unmanaged resources, it CANNOT reclaim managed memory, only the GC can do that.
The first is better. It ensures it is disposed even if an exception is thrown, and it correctly handles the case where Create(0)
returns null (i.e. it doesn't attempt to call Dispose()
on a null instance).
A using
statement is always better because...
Dispose()
, even as the code evolves into different code pathsDispose()
gets called even if there's an exception. It also checks for null
before calling Dispose()
, which may be useful (assuming you're not just calling new
).One non-obvious (to me, anyway) trick with using
is how you can avoid excessive nesting when you have multiple disposable objects:
using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
input.copyTo(output);
}
The VS code formatter will leave the two statements starting in the same column.
In fact, in some situations you don't even have to repeat the using statement...
using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))
However, the restrictions for declaring multiple variables on the same line applies here so the types must be the same and you cannot use the implicit type var.
Where you can, use using
for the reasons Marc cites. OTOH this isn't a brain dead solution as sometimes the lifetime of the object can't be defined as a lexical scope so use it reasonably.
The only place you don't want to use a using block is where the disposable object is scoped outside of the function. In this case, your class should implement IDisposable and dispose of the object in its Dispose().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With