c#: Le unmanaged resource, l’interfaccia IDisposable e lo statement using

Cosa sono le unmanaged resource: sono le risorse non gestite direttamente dal Garbace Collector. Due classici esempi sono i file e i font. La gestione di queste risorse è a carico del programmatore e può essere gestita attraverso i metodi Finalize and Dispose, per evitare memory leaks e risorse bloccate.

Cos’è l’interfaccia IDisposable: L’interfaccia IDisposable definisce un metodo (dispose) per il rilascio delle risorse allocate. L’implementazione di questa interfaccia in una unmanaged resource, permette di gestirne al meglio il ciclo di vita e la deallocazione di tutte le risorse coinvolte.

Cos’è lo statement using: using assicura che che gli oggetti IDisposable vengano usati correttamente. Ovvero, si assicura che venga sempre chiamato il metodo dispose() di un oggetto IDisposabile, anche in caso di eccezioni.

Ecco un classico esempio di utilizzo di using:

// Leggo una riga da un file di testo
string riga;
using (StreamReader reader = new StreamReader(@"c:\file.txt"))
{
   riga = reader.ReadLine();
}
 
// Scrivo una riga su file di testo:
using (StreamWriter myStream = new StreamWriter(_path, true))
{
   myStream.Write(sText);
}

Al termine di using non rimane nessuna traccia dell’oggetto reader instanziato, ed il suo metodo dispose() è stato chiamato. Ecco perchè using può essere usato solo con classi che implementano l’interfaccia IDisposable.

Ecco come può essere la gestione della scrittura di una stringa su file di testo inserendo using all’interno di un try/catch/finally:

String exception = "";
try {
   using (StreamWriter myStream = new StreamWriter(_path, true)) {
   myStream.Write(sText);
}
catch (IOException ioe) {
   exception = ioe.ToString();
}
...
...
...
catch (SecurityException se) {
   exception = se.ToString();
}
finally
{
   if (!"".Equals(exception)) Console.WriteLine(exception); }
}

Ecco un esempio di classe IDisposable e del relativo utilizzo di using:

public class Prova : IDisposable
{
   UnaMiaRisorsa risorsa;
   public Prova() {
   risorsa = new UnaMiaRisorsa(...);
   ...
   ...
   ...
 
   public void UtilizzaRisorsa() {
      // Utilizzo la mia risorsa
   }
 
   public void Dispose()
   {
      // Lasciamo libere le risorse. Ad esempio:
      UnaMiaRisorsa = null;
   }
}

Ed ecco come usiamo Prova

using (Prova prova = new Prova) {
   prova.UtilizzaRisorsa();
}

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>