Condividi tramite


Istruzione using (Riferimenti per C#)

Aggiornamento: Luglio 2008

Fornisce una sintassi utile che garantisce l'utilizzo corretto degli oggetti IDisposable.

Esempio

Nell'esempio riportato di seguito viene illustrato come utilizzare l'istruzione using.

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

Note

File e Font sono esempi di tipi gestiti che accedono a risorse non gestite, in questo caso handle di file e contesti di dispositivo. Sono disponibili altri tipi di risorse e di librerie di classi non gestite che li incapsulano. Tutti questi tipi devono implementare l'interfaccia IDisposable.

Quando si utilizza un oggetto IDisposable, è di norma necessario dichiararlo e crearne un'istanza in un'istruzione using. L'istruzione using chiama il metodo Dispose sull'oggetto nel modo corretta e, quando utilizzata come illustrato in precedenza, fa in modo che l'oggetto stesso esca dall'ambito 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. L'esempio di codice precedente viene esteso al codice riportato di seguito in fase di compilazione (le parentesi graffe aggiuntive creano l'ambito limitato per l'oggetto):

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

È possibile utilizzare più oggetti con un'istruzione using, ma è necessario dichiararli nell'istruzione using, come illustrato nell'esempio seguente:

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

Benché sia possibile creare un'istanza dell'oggetto risorsa e passare la variabile all'istruzione using, non si tratta di una procedura consigliata. In questo caso, l'oggetto rimane in ambito dopo il rilascio del blocco using da parte del controllo, anche se probabilmente non ha più accesso alle proprie risorse non gestite. Ciò significa che non è più completamente inizializzato. Il tentativo di utilizzare l'oggetto all'esterno del blocco using potrebbe causare la generazione di un'eccezione. Per questo motivo, è in genere consigliabile creare un'istanza dell'oggetto nell'istruzione using e limitarne l'ambito al blocco using.

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


Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 5.3.3.17 Istruzioni using

  • 8.13 Istruzione using

Vedere anche

Concetti

Guida per programmatori C#

Implementazione di un metodo Dispose

Riferimenti

Parole chiave di C#

Direttiva using (Riferimenti per C#)

Implementazione dei metodi Finalize e Dispose per la pulitura delle risorse non gestite

Altre risorse

Riferimenti per C#

Garbage Collection

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Aggiunto esempio di codice dopo l'introduzione.

Correzione di errori nel contenuto.