Come utilizzare il blocco using

L’istruzione using fornisce una sintassi utile che garantisce l’utilizzo corretto degli oggetti IDisposable.
Cominciamo con un esempio:

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

Font (come File) è un classico esempio di un tipo managed che accede a risorse unmanaged, come handle di file o contesti di dispositivo.

Tutti questi tipi devono implementare l’interfaccia IDisposable.

Quando si utilizza un oggetto IDisposable, è di norma dichiararlo e crearne un’istanza in un’istruzione using.

L’istruzione using chiama il metodo Dispose sull’oggetto nel modo corretto e fa in modo che l’oggetto stesso esca dallo scope non appena viene chiamato il metodo Dispose.

All’interno del blocco using, l’oggetto è di sola lettura e non può essere modificato né riassegnato.

L’istruzione using assicura che venga chiamato il metodo Dispose anche se si verifica un’eccezione mentre vengono chiamati metodi sull’oggetto.

È possibile ottenere lo stesso risultato inserendo l’oggetto in un blocco try e chiamando il metodo Dispose in un blocco finally, in quanto l’istruzione using viene tradotta in questo modo dal compilatore.

Il codice indicato sopra che utilizza il blocco using è esatamente analogo a questo (le parentesi graffe aggiuntive limitano lo scope dell’oggetto):

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

E’ possibile inizializare più istanze nello stesso blocco using, cosa che rende estremamente più leggibile il codice:

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

E’ possibile inizializzare un oggetto e sucessivamente passare l’istanza al bloco using, anche se non è una pratica consigliata in quanto l’oggetto rimane nello scope del metodo anche se probabilmente non ha più accesso alle sue risorse unmanaged e il tentativo di utilizzarlo al di fuori del blocco using pottebbe causare un’eccezione.

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
    // use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight();

Indice

Share
Ultimi articoli
Join

Newsletter

Nessuno spam, solo articoli interessanti ;)

Focus

Post correlati

semaphoreslim

SmaphoreSlim 101

SemaphoreSlim è una classe che permette la sincronizzazione di n thread che hanno una risorsa (scarsa) condivisa limitandone l’uso ad un numero massimo.

interlocked

Interlocked 101

La sincronizzazione dei thread è un elemento fondamentale nella programmazione asincrona, ne ho infatti parlato in vari post. La soluzione più versatile è sicuramente utilizzare

event

Come testare gli eventi

Testare che degli eventi siano stato effettivamente lanciati in C# non è immediato. Tipicamente è possibile testare che un evento venga lanciato aspettando un ManualResetEvent

Codice Pragmatico

Contatti

Per informazioni, dubbi o consulenze non esitate a contattarmi.

Lascia un messaggio

Ricevi le ultime news

Iscrivi alla newsletter

Solo articoli interessanti, promesso ;)