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»).