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();