In Visual Studio, when I type the line ‘Implements IDisposable‘, the IDE automatically adds:
- a
disposedValuemember variable - a
Sub Dispose() Implements IDisposable.Dispose - a
Sub Dispose(ByVal disposing As Boolean)
The Dispose() should be left alone, and the clean up code should be put in Dispose(disposing).
However the Dispose Finalize Pattern says you should also override Sub Finalize() to call Dispose(False). Why doesn’t the IDE also add this? Must I add it myself, or is it somehow called implicitly?
EDIT: Any idea why the IDE automatically adds 80% of the required stuff but leaves out the Finalize method? Isn’t the whole point of this kind of feature to help you not forget these things?
EDIT2: Thank you all for your excellent answers, this now makes perfect sense!
If you actually are holding non-managed resources that will not be automatically cleaned up by the garbage collector and cleaning those up in your Dispose(), then yes, you should do the same in Finalize().
If you’re implementing IDisposable for some other reason, implementing Finalize() isn’t required.
The basic question is this: If Dispose() wasn’t called and your object garbage collected, would memory leak? If yes, implement Finalize. If no, you don’t need to. Also, avoid implementing Finalize ‘just because it’s safer’. Objects with custom finalizers can potentially need two GC passes to free them — once to put them on the pending finalizers queue, and a second pass to actually free their memory.