First of all in C# one can't "forget" to call base class finalizer in derived class because there is no syntax to override base class finalizer - it will be called always (similar to constructors).
Indeed one can override Dispose
and forget to call base class' version - in this case implementation of finalization in base class will be skipped. On other hand when properly implemented finalize-able classes in C# would not cause fatal issues if derived class forgets to dispose parent one - classes that really manage native resources (like OS handles) should be sealed and thus protected from the issue (as one can't override any methods in this case).
On second half about finalizing order:
I don't know how or if Java finalization guarantees that objects are finalized in consistent order so all references are valid till all finalizers finished...
In .Net/C# finalizers order is undefined - meaning after determining what objects need to be finalized (due to lack of external references) objects from that set will get finilizer called without any particular ordering. As result if objects in the set refer to each other than when finalizer of last object is called all other ones are already finalized.