Istruzione Using (Visual Basic)

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

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Parti

Argomento

Definizione

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

Facoltativo. 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 ] ) ]

In alternativa

resourcename As resourcetype = resourceexpression

Parti di resourcelist

Argomento

Definizione

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

Facoltativo. Elenco di argomenti passati al costruttore per creare un'istanza del parametro resourcetype. Vedere Elenco dei parametri (Visual Basic).

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. Tuttavia, è comunque possibile utilizzare un blocco Using per forzare l'eliminazione di una risorsa gestita invece di attendere il Garbage Collector.

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. Tale operazione consente all'oggetto di terminare correttamente le relative risorse. 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.
Finally 
    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 (Visual Basic)

Riferimenti

IDisposable

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

System.Drawing

Font