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)