I had some very wrong sounding advice recently from a \"senior\" developer/coworker regarding the C# garbage collector such as...
\"You need to use destructors
He's backwards on destructors. You need to not use destructors in C# unless vital. And if you do use them, you should call SuppressFinalize() if you know the object is in a state where the destructor code is no longer needed (most often because the same clean-up happened in a call to IDisposable.Dispose(). If an object has a destructor and SuppressFinalize has not been called, it will live longer (so that it can have that destructor called).
The Garbage Collector most certainly can be relied upon. It can't be relied upon to call a destructor, or to do so within a certain amount of time, but that's not a matter of it not being reliable, it's a matter of it being reliable in collecting garbage which is its job!
I don't know much about the Java Garbage Collector, and I have no doubt that he's right in saying they can't be thought of like each other when you're getting down to the finer details, though I would hope for the sake of Java coders that it can be thought of like the .NET one most of the time - which is to not think of it at all, generally you don't have to.