?
Richtig, den Speicher, den das Objekt belegt, kannst du nicht freigeben, das kann nur der GC. In Dispose() kannst du aber z.B. Netzwerkverbindungen beenden, Datei-Handles schließen und andere Aufräumarbeiten machen. Dinge, die halt wichtig sind. Speicher ist nicht wichtig, das kann der GC perfekt machen.
Um anzuzeigen, dass eine Klasse kritische Resourcen nutzt, sollte man dann IDisposable verwenden, das erlaubt es einen auch, das Ding in einem using-Statement zu benutzen. Außerdem sollte man Object.Finalize() redefinieren, so dass es Dispose() aufruft, wie in meinem Beispiel gezeigt. (~Klasse ist in C# Object.Finalize(), ich finde die Syntax schlecht gewählt, weil sie C++ Programmierer verwirrt, weil eigentlich Dispose() der C++-Destruktor wäre). Dies sorgt auch auf Klassendesign-Ebene dafür, dass selbst ein DAU-Programmierer die Klasse nicht mehr völlig falsch benutzen kann.
Ob du bei einem dispostem Objekt wieder Methoden aufrufen kannst, hängt von dir ab. CreateResource() sollte eine Exception werfen, wenn das Objekt disposed ist.
Es ist auch sehr wichtig, zu beachten, dass ein Objekt wieder lebendig werden kann. Wenn der Programmierer vergisst, Dispose() aufzurufen und es irgendwann der GC macht, ist das Objekt wohl nicht referenziert. Im Destruktor lässt sich aber Code schreiben, der das Objekt wieder referenziert werden lässt. Wenn das Objekt dann irgendwann wieder nicht mehr referenziert ist, wird ~Klasse nicht mehr aufgerufen, außer man reregistriert das Objekt explizit beim GC. Im Allgemeinen sollte das aber eher selten der Fall sein, dass der Destruktor das Objekt wieder ins Leben zurückruft. IMHO ist es sogar schlechter Stil.