Is Close() same as Using statement?
No it is not.
Should you call Close()
after a using
?
No, it will break due to access to the disposed object.
Should I call Close()
before exiting the using
block?
It's complicated. If the IDisposable
interface is implemented correctly: no. Otherwise: possibly.
Close()
has no relation to IDisposable
interface, see: https://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx
using
only applies to IDisposable
inherited objects, see: https://msdn.microsoft.com/en-us/library/yh598w02.aspx
Thus:
Close()
and Dispose()
may not considered to be related in any way.
When the IDisposable
interface is correctly implemented, you may assume all clean-up necessary will be carried out. This implies an internal call to a Close()
method would be carried out. This means that an explicit call to Close()
should not be necessary.
The other way round; when a object is of type IDisposable
and exposes a Close()
method, a call to Close()
will not be sufficient to properly dispose/clean-up the object. Dispose()
must still be called, you can do this directly, or through the using
statement.
You can also let the garbage-collector handle the Dispose()
call for you (if its correctly implemented, see: Proper use of the IDisposable interface) But this is considered bad-practice, since you need to rely on a proper implementation and have no direct control over the GC timing.
Please note, a reason to implement a Close()
function, is usually to give a developer a way to reuse the object. After calling Dispose()
the object is considered to be marked for finalization and may not be used any more.