Mal for klasse med egen ressursfrigjøring

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *