Har man en klasse som benytter mye «managed» minne kan man selv implementere og sende kall til Dispose() for å frigjøre minnet med en gang man er ferdig.
Om man bruker «unmanaged» minne bør også dette frigjøres her, i tillegg må man implementere metoden ~NavnPåKlasse() som GC kan bruke i tillfelle man glemmer å sende kall til Dispose() på egenhånd.
Her er en ferdig mal som inneholder alt dette:
class Klasse : IDisposable { private bool brukerFortsattRessurser = true; ~Klasse() { // Frigjør bare 'unmanaged' ressurser: FrigjørRessurser(false); Console.WriteLine("~Klasse() kalt"); } public void Dispose() { // Frigjør både 'managed' og 'unmanaged' ressurser: FrigjørRessurser(true); // Fortell GC at ~Klasse() ikke trengs å kjøres: GC.SuppressFinalize(this); Console.WriteLine("Dispose() kalt"); } private void FrigjørRessurser(bool beggeTyper) { // Frigjør både 'managed' og 'unmanaged' ressurser hvis dette ikke er gjort: if (brukerFortsattRessurser) { // Frigjør 'managed' ressurser her: if (beggeTyper) { // .. } // Frigjør 'unmanaged' ressurser her // .. brukerFortsattRessurser = false; } Console.WriteLine("FrigjørRessurser(" + beggeTyper + ") kalt"); } }
Her bør hver nye metode man lager først kontrollere at brukerFortsattRessurser er sann. Er Dispose() allerede kjørt burde nye metodekall gi unntak (altså «exception»).