I know there are a number of threads on here about how to use the using statement and calling the Dispose() method. I have read the majority of these threads.
If I call Dispose(), does it call Close()?
If I want to use an object (say SqlDataReader), but then use it again in another code block, should I not call Dispose()? Which also means to omit the using statement.
Also, to clarify, if a FileStream is wrapping a StreamWriter and I call dispose on the FileStream, this will call Flush(), Close() and Dispose() (depending on whether Dispose() calls Close()) on the StreamWriter, right? Likewise, if I call Close on the FileStream, this will only call Flush() and Close() on the FileStream.
Is checking IL a good way to answer these questions about what is happening under the hood?
Calling
Disposeshould take any required actions to dispose of the resource, which should be similar, if not identical to, callingClose. This, however, is an implementation detail and not necessarily guaranteed (though we can expect that the BCL follows this guideline).If you want to use the object again, you definitely should not dispose it. However, you should typically use two separate connections if you’re going to the database two separate times. It’s generally not a good idea to keep an IDataReader around an longer than is needed to grab your needed data.
Disposing an object that wraps another disposable object should call
Disposeon the interior object. CallingCloseon aFileStreamwill call itsDisposemethod under the good, so it will also act on both streams.Checking IL will definitely answer most of these questions definitively. As @Rich says, you can also just try debugging your own Dispose implementations. There is also, of course, MSDN documentation to start with before you try to figure it out yourself, and Reflector if you don’t want to muck around in IL.