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 è esattamente 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 inizializzare 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 successivamente passare lâistanza al blocco 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 potrebbe 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();