It is very rare for a finalizer to be useful. The documentation you refer to is not entirely useful - it offers the following pretty cool tips:
Implementation Complete only objects that require finalization
This is a great example of begging, but it is not very helpful.
In practice, the vast majority of the time when you do not want a finalizer. (One of the learning curves that .NET developers should go through is to find that in most places they think they need a finalizer, they don’t.) You noted this as (among other things) a WPF question and I would say , which would almost always be a mistake to put the finalizer on the user interface object. (So, even if you are in one of the unusual situations, which, as it turned out, requires a finalizer, this work does not belong to anyone near the code that relates to WPF.)
For most scenarios in which finalizers look like they might be useful, they turn out to be different, because by the time your finalizer starts up, it's too late to do anything useful.
For example, it is usually a bad idea to try to do something with any of the objects referenced by your object, because by the time your finalizer starts, these objects can already be completed. (.NET makes no guarantees regarding the order in which finalizers are run, so you simply cannot find out if the objects you have links to have been finalized.) It's a good idea to call a method on an object whose finalizer has already been started.
If you have any way to find out that some object has definitely not been finalized, it is safe to use it, but this is a rather unusual situation. (... if the object does not have a finalizer, and does not use the finalized resources themselves. But in this case it is probably not the object that you really need to do when your own object leaves.)
The main situation in which finalizers seem useful is interop: for example, suppose you use P / Invoke to call some unmanaged API, and this API returns a handle to you. Perhaps there is another API that needs to be called in order to close this handle. Since all things are unmanageable, the .NET GC does not know what these descriptors are, and it is your job to make sure they are cleared, and at this point the finalizer is reasonable ... except in practice, it is almost always better to use SafeHandle for this scenario.
In practice, the only places I found using finalizers were: a) experiments designed to examine what the GC does, and b) diagnostic code designed to detect how specific objects are used in the system. None of the codes should go into production.
So the answer to whether you need to "implement the finalizer in the child class too or not" is: if you need to ask, then the answer will be negative.
As for flag duplication ... the other answers here give conflicting advice. Highlights: 1) you need to call basic Dispose and 2) your Dispose should be idempotent. (That is, it doesn’t matter if he calls one, two, five, 100 times - he should not complain if he called more than once.) You can implement this as you wish - the Boolean flag in one case, but I often found that it is enough to set certain fields to null in my Dispose method, and at this point it eliminates the need for a separate Boolean flag - you can say that Dispose already called because you already set these fields to null .
Many of the recommendations on IDisposable extremely useless, as it concerns a situation where you need a finalizer, but this is really a very unusual case. This means that many people write IDisposable implementations that are much more complicated than necessary. In practice, most classes call the category "Stephen Cleary," called "level 1" in an article related to jpgerson . And for this, you do not need all the GC.KeepAlive , GC.SuppressFinalize and Dispose(bool) tags that clutter up most of the examples. Life is actually much simpler in most cases, as the Cleary tip for these level 1 types shows.