Code Reviews and IDisposable
Warning: C# biased code to follow.....
Been doing a lot of code reviews lately and one thing I have noticed is either a lack of use of the IDisposable interface or simply not knowing it even exists let alone its purpose. Just recently I reviewed some code where explicit calls to GC.Collect() have been thrown in to “help reclaim memory”. It ended up being that another component in a library they used was making unmanaged calls and the developers were not calling the Dispose() method but it was of concern that the first port of call for this developer was to throw in this explicit call to GC.Collect(). Whats even more concerning is that the Tech lead in this project advocated this and when I mentioned the preferred use of IDisposable interface in the offending component I received a blank stare and a response of “uummmmmm....”.
While its obvious that all that is bad thing it brings up
a point I have been thinking about. The
IDisposable interface is, IMHO, not best way of
implementing the release of unmanaged resources. It just
“feels” a bit too manual. the “using” statement helps but
its still manual. If a class you are using implements
IDisposable, then you should call
Dispose(), and along with this you generally must
call GC.SuppressFinalize(this); to prevent the
finalizing of the object. Ideally I'd like the framework
to do all this for me. Granted, just calling the
Dispose() method is not really hard, its just
seems more manual than it should be, given the usual
crucial nature of its operation. When you supply a
Finalize() method, the framework calls that. I am
sure a similar method could be employed, but I am no
compiler expert.Perhaps something like:-
[GarbageCollection(CollectionType.Immediate)]
public class
SomeClass : IDisposable
{
public Dispose() { ......
}
}
And let the framework do the rest. All
callers of this class would not worry about calling the
Dispose method as it would do this for them, and suppress
its finalzation as well. Then again, perhaps I am making
too much of a fuss over things. I'd be interested too hear
if anyone else thinks the same or simply feels I am
rambling...