The following code snippet demonstrates the only way that I know of that the C# language specification treats IDisposable differently than any other interface:
// StreamReader implements IDisposable.
using (var myStreamReader = new StreamReader(“c:\foo.txt”))
StreamReader implements the IDisposable interface and can therefore be used with the using C# keyword. At the end of the using block, the myStreamReader object’s Dispose() method will run automatically.
You may speculate that an object implementing IDisposable somehow pays a penalty, perhaps by demotion to a slower garbage-collection tier, but according to Microsoft, IDisposable works like any other interface in garbage collection.
Although C# does not penalize objects implementing IDisposable, the usual recommendation to let the common language runtime (CLR) garbage-collect them without worrying about calling Dispose methods makes good sense.
I read somewhere that you should implement IDisposable only if your class references unmanaged resources. I think implementing IDisposable can improve quality in several ways:
- For performance reasons, you wish to free a resource sooner rather than later. For example, while a managed database connection or file handle will close when the garbage collector collects the object, you may wish to free the resources as soon as your application no longer needs them.
- You need to call the Dispose method on sub-objects that you own.
- Ease verifying correctness when working with complex object relationships. If, in a Dispose method, you clear values for all or most of your fields, then if some other object is mistakenly continuing to reference a field on the disposed object, you will likely catch the error quickly as a null reference or out-of-range error. I have found this to be especially helpful when forgetting to unregister from an event. When the event handler runs, it usually references a cleared out field and breaks, thus alerting me to my coding error.
- And of course, if you have unmanaged resources, you should implement IDisposable to close/free/release them.
Do you use IDisposable for reasons not mentioned above? Please add comments to describe those cases.
Please add comments to help refine the use of IDisposable or to show your support of this post.