Istruzione Using (Visual Basic)

Aggiornamento: novembre 2007

Dichiara l'inizio di un blocco Using e facoltativamente acquisisce le risorse di sistema controllate dal blocco.

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Parti

  • resourcelist
    Obbligatoria se non viene fornito il parametro resourceexpression. Elenco di una o più risorse di sistema controllate da questo blocco Using.

  • resourceexpression
    Obbligatoria se non viene fornito il parametro resourcelist. Variabile di riferimento o espressione che fa riferimento a una risorsa di sistema che questo blocco Using deve controllare.

  • statements
    Facoltativa. Blocco di istruzioni eseguite dal blocco Using.

  • End Using
    Obbligatoria. Termina la definizione del blocco Using ed elimina tutte le risorse che esso controlla.

La sintassi delle singole risorse di resourcelist utilizza le parti seguenti:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-oppure-

resourcename As resourcetype = resourceexpression

Parti di resourcelist

  • resourcename
    Obbligatoria. Variabile che fa riferimento a una risorsa di sistema controllata dal blocco Using.

  • New
    Obbligatoria se l'istruzione Using acquisisce la risorsa. Se la risorsa è già stata acquisita, utilizzare la seconda alternativa di sintassi.

  • resourcetype
    Obbligatoria. Classe della risorsa. La classe deve implementare l'interfaccia IDisposable.

  • arglist
    Facoltativa. Elenco di argomenti passati al costruttore per creare un'istanza del parametro resourcetype. Per informazioni, vedere Elenco parametri.

  • resourceexpression
    Obbligatoria. Variabile o espressione che fa riferimento a una risorsa di sistema che soddisfa i requisiti del parametro resourcetype. Se si utilizza la seconda alternativa di sintassi, è necessario acquisire la risorsa prima di passare il controllo all'istruzione Using.

Note

Talvolta il codice richiede una risorsa non gestita, come ad esempio un handle di file, un wrapper COM o una connessione SQL. Un blocco Using garantisce che una o più di queste risorse vengano eliminate quando non sono più necessarie al codice. In questo modo, esse tornano disponibili per altro codice.

Le risorse gestite vengono eliminate dal Garbage Collector (GC) di .NET Framework senza necessità di scrivere altro codice. Non è necessario un blocco Using per le risorse gestite.

Un blocco Using è suddiviso in tre parti, ovvero acquisizione, uso ed eliminazione.

  • Per acquisizione si intende la creazione di una variabile e la sua inizializzazione affinché faccia riferimento alla risorsa di sistema. L'istruzione Using può acquisire una o più risorse oppure è possibile acquisire specificamente una risorsa prima di accedere al blocco e fornirla all'istruzione Using. Se si fornisce il parametro resourceexpression, è necessario acquisire la risorsa prima di passare il controllo all'istruzione Using.

  • Per uso si intende accedere alle risorse e utilizzarle per eseguire delle operazioni. Le istruzioni fra Using e End Using rappresentano l'uso delle risorse.

  • Per eliminazione si intende chiamare il metodo Dispose per l'oggetto in resourcename. Questo consente all'oggetto di terminare correttamente la risorsa non gestita. L'istruzione End Using elimina le risorse che si trovano sotto il controllo del blocco Using.

Comportamento

Un blocco Using si comporta come una costruzione Try...Finally in cui il blocco Try utilizza le risorse e il blocco Finally le elimina. Per questo motivo, il blocco Using garantisce l'eliminazione delle risorse, indipendentemente dalle modalità con cui viene terminato il blocco di istruzioni. Questo meccanismo è valido anche per le eccezioni non gestite, con esclusione dell'eccezione StackOverflowException.

L'ambito di ogni variabile di risorsa acquisita dall'istruzione Using è limitato al blocco Using.

Se si specificano più risorse di sistema nell'istruzione Using, si ottiene lo stesso effetto ottenuto nidificando dei blocchi Using uno nell'altro.

Gestione strutturata delle eccezioni all'interno di un blocco Using

Se è necessario gestire un'eccezione che potrebbe verificarsi all'interno del blocco Using, è possibile aggiungergli una costruzione Try...Finally completa. Se è necessario gestire il caso in cui l'istruzione Using non ha esito positivo nell'acquisizione di una risorsa, è possibile eseguire un test per verificare se il valore del parametro resourcename è Nothing.

Gestione strutturata delle eccezioni in alternativa a un blocco Using

Se è necessario poter controllare in modo più specifico l'acquisizione delle risorse o se è necessario altro codice nel blocco Finally, è possibile riscrivere il blocco Using come costruzione Try...Finally. Nell'esempio seguente sono riportate le costruzioni di base di Try e Using che si equivalgono per quanto riguarda l'acquisizione e l'eliminazione di resource.

Using resource As New resourceType 
    ' Insert code to work with resource.
End Using
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Catch ex As Exception
    ' Insert code to process exception.
Finally 
    ' Insert code to do additional processing before disposing of resource.
    resource.Dispose()End Try
Nota:

il codice all'interno del blocco Using non deve assegnare l'oggetto in resourcename a un'altra variabile. Quando si esce dal blocco Using, la risorsa viene eliminata e l'altra variabile non può accedere alla risorsa a cui punta.

Esempio

Nell'esempio seguente viene utilizzato un blocco Using per acquisire un nuovo tipo di carattere. Questo garantisce che il sistema chiami il metodo Dispose per il tipo di carattere quando il codice esce dal blocco.

Public Sub setbigbold(ByVal c As Control)
    Using nf As New System.Drawing.Font("Arial", 12.0F, _
        System.Drawing.FontStyle.Bold)

        c.Font = nf
        c.Text = "This is 12-point Arial bold"
    End Using
End Sub

Vedere anche

Attività

Procedura: eliminare una risorsa di sistema

Riferimenti

IDisposable

Istruzione Try...Catch...Finally (Visual Basic)

System.Drawing

Font