Istruzione using (Riferimenti per C#)using statement (C# Reference)

Offre una comoda sintassi che verifica l'uso corretto degli oggetti IDisposable.Provides a convenient syntax that ensures the correct use of IDisposable objects.

EsempioExample

L'esempio seguente mostra come usare l'istruzione using.The following example shows how to use the using statement.

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

A partire C# da 8,0, è possibile usare la sintassi alternativa seguente per l'istruzione using che non richiede le parentesi graffe:Beginning with C# 8.0, you can use the following alternative syntax for the using statement that doesn't require braces:

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

NoteRemarks

File e Font sono esempi di tipi gestiti che accedono a risorse non gestite (in questo caso handle di file e contesti di dispositivo).File and Font are examples of managed types that access unmanaged resources (in this case file handles and device contexts). Esistono molti altri tipi di risorse non gestite e tipi della libreria di classi che le incapsulano.There are many other kinds of unmanaged resources and class library types that encapsulate them. Ogni tipo deve implementare l'interfaccia IDisposable.All such types must implement the IDisposable interface.

Quando la durata di un oggetto IDisposable è limitata a un singolo metodo, è necessario dichiararlo e creare un'istanza nell'istruzione using.When the lifetime of an IDisposable object is limited to a single method, you should declare and instantiate it in the using statement. L'istruzione using chiama il metodo Dispose sull'oggetto in modo corretto e, quando viene usata come illustrato in precedenza, fa in modo che l'oggetto stesso esca dall'ambito non appena viene chiamato il metodo Dispose.The using statement calls the Dispose method on the object in the correct way, and (when you use it as shown earlier) it also causes the object itself to go out of scope as soon as Dispose is called. All'interno del blocco using l'oggetto è di sola lettura e non può essere modificato o riassegnato.Within the using block, the object is read-only and cannot be modified or reassigned.

L'istruzione using garantisce che Dispose venga chiamato anche se si verifica un'eccezione nel blocco using.The using statement ensures that Dispose is called even if an exception occurs within the using block. È possibile ottenere lo stesso risultato inserendo l'oggetto all'interno di un blocco try e chiamando Dispose in un blocco finally. Di fatto questo è il modo in cui l'istruzione using viene convertita dal compilatore.You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using statement is translated by the compiler. L'esempio di codice precedente si espande al codice seguente in fase di compilazione (si notino le parentesi graffe aggiuntive per creare l'ambito limitato per l'oggetto):The code example earlier expands to the following code at compile time (note the extra curly braces to create the limited scope for the object):

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

La sintassi dell'istruzione using più recente si traduce in codice molto simile.The newer using statement syntax translates to very similar code. Il blocco try viene aperto in cui viene dichiarata la variabile.The try block opens where the variable is declared. Il blocco finally viene aggiunto alla chiusura del blocco di inclusione, in genere alla fine di un metodo.The finally block is added at the close of the enclosing block, typically at the end of a method.

Per altre informazioni sull'istruzione try-finally, vedere l'argomento try-finally.For more information about the try-finally statement, see the try-finally topic.

È possibile dichiarare più istanze di un tipo nell'istruzione using, come illustrato nell'esempio seguente:Multiple instances of a type can be declared in the using statement, as shown in the following example:

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

È possibile combinare più dichiarazioni dello stesso tipo usando la nuova sintassi introdotta anche con C# 8.You can combine multiple declarations of the same type using the new syntax introduced with C# 8 as well. Questa operazione è illustrata nell'esempio seguente:This is shown in the following example:

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

È possibile creare un'istanza dell'oggetto risorsa e quindi passare la variabile all'istruzione using, ma questa procedura non è consigliata.You can instantiate the resource object and then pass the variable to the using statement, but this is not a best practice. In questo caso l'oggetto rimane nell'ambito quando il controllo lascia il blocco using, anche se probabilmente non avrà più accesso alle relative risorse non gestite.In this case, after control leaves the using block, the object remains in scope but probably has no access to its unmanaged resources. In altre parole, non è più completamente inizializzato.In other words, it's not fully initialized anymore. Se si tenta di usare l'oggetto di fuori del blocco using, si rischia di causare la generazione di un'eccezione.If you try to use the object outside the using block, you risk causing an exception to be thrown. Per questo motivo, in genere è preferibile creare un'istanza dell'oggetto nell'istruzione using e limitare l'ambito al blocco using.For this reason, it's generally better to instantiate the object in the using statement and limit its scope to the using block.

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

Per altre informazioni sull'eliminazione degli oggetti IDisposable, vedere Uso di oggetti che implementano IDisposable.For more information about disposing of IDisposable objects, see Using objects that implement IDisposable.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere Istruzione using nella specifica del linguaggio C#.For more information, see The using statement in the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also