Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dichiara l'inizio di un Using blocco e, facoltativamente, acquisisce le risorse di sistema che il blocco controlla.
Sintassi
Using { resourcelist | resourceexpression }
[ statements ]
End Using
Parti
| Termine | Definizione |
|---|---|
resourcelist |
Obbligatorio se non si specifica resourceexpression. Elenco di una o più risorse di sistema che questo Using blocco controlla, separate da virgole. |
resourceexpression |
Obbligatorio se non si specifica resourcelist. Variabile o espressione di riferimento che fa riferimento a una risorsa di sistema da controllare da questo Using blocco. |
statements |
Opzionale. Blocco di istruzioni eseguite dal Using blocco. |
End Using |
Obbligatorio. Termina la definizione del Using blocco ed elimina tutte le risorse che controlla. |
Ogni risorsa nella resourcelist parte ha la sintassi e le parti seguenti:
resourcename As New resourcetype [ ( [ arglist ] ) ]
oppure
resourcename As resourcetype = resourceexpression
Parti dell'elenco di risorse
| Termine | Definizione |
|---|---|
resourcename |
Obbligatorio. Variabile di riferimento che fa riferimento a una risorsa di sistema che controlla il Using blocco. |
New |
Obbligatorio se l'istruzione Using acquisisce la risorsa. Se la risorsa è già stata acquisita, usare la seconda alternativa di sintassi. |
resourcetype |
Obbligatorio. Classe della risorsa. La classe deve implementare l'interfaccia IDisposable . |
arglist |
Opzionale. Elenco di argomenti passati al costruttore per creare un'istanza di resourcetype. Vedere Elenco parametri. |
resourceexpression |
Obbligatorio. Variabile o espressione che fa riferimento a una risorsa di sistema che soddisfa i requisiti di resourcetype. Se si usa la seconda alternativa di sintassi, è necessario acquisire la risorsa prima di passare il controllo all'istruzione Using . |
Osservazioni:
A volte il codice richiede una risorsa non gestita, ad esempio un handle di file, un wrapper COM o una connessione SQL. Un Using blocco garantisce l'eliminazione di una o più risorse di questo tipo al termine del codice. In questo modo è possibile renderli disponibili per l'uso da parte di altro codice.
Le risorse gestite vengono eliminate dal Garbage Collector (GC) di .NET Framework senza scrivere codice aggiuntivo. Non è necessario un Using blocco per le risorse gestite. Tuttavia, è comunque possibile usare un Using blocco per forzare l'eliminazione di una risorsa gestita anziché attendere il Garbage Collector.
Un Using blocco ha tre parti: acquisizione, utilizzo e eliminazione.
L'acquisizione significa creare una variabile e inizializzarla per fare riferimento alla risorsa di sistema. L'istruzione
Usingpuò acquisire una o più risorse oppure è possibile acquisire esattamente una risorsa prima di immettere il blocco e fornirla all'istruzioneUsing. Se si specificaresourceexpression, è necessario acquisire la risorsa prima di passare il controllo all'istruzioneUsing.L'utilizzo significa accedere alle risorse ed eseguire azioni con esse. Le istruzioni tra
UsingeEnd Usingrappresentano l'utilizzo delle risorse.Smaltimento significa chiamare il Dispose metodo sull'oggetto in
resourcename. In questo modo l'oggetto può terminare le risorse in modo pulito. L'istruzioneEnd Usingelimina le risorse sotto ilUsingcontrollo del blocco.
Comportamento
Un Using blocco si comporta come una Trycostruzione ...Finally in cui il Try blocco usa le risorse e il Finally blocco li elimina. Per questo motivo, il Using blocco garantisce l'eliminazione delle risorse, indipendentemente dal modo in cui si esce dal blocco. Questo vale anche nel caso di un'eccezione non gestita, ad eccezione di .StackOverflowException
L'ambito di ogni variabile di risorsa acquisita dall'istruzione Using è limitato al Using blocco.
Se si specificano più risorse di sistema nell'istruzione Using , l'effetto è uguale a quello dei blocchi annidati Using uno all'interno dell'altro.
Se resourcename è Nothing, non viene eseguita alcuna chiamata a Dispose e non viene generata alcuna eccezione.
Gestione strutturata delle eccezioni all'interno di un blocco using
Se è necessario gestire un'eccezione che potrebbe verificarsi all'interno del Using blocco, è possibile aggiungere una costruzione ...Finally completaTry. Se è necessario gestire il caso in cui l'istruzione Using non riesce ad acquisire una risorsa, è possibile verificare se resourcename è Nothing.
Gestione delle eccezioni strutturate anziché un blocco using
Se è necessario un controllo più corretto sull'acquisizione delle risorse o è necessario codice aggiuntivo nel Finally blocco, è possibile riscrivere il Using blocco come costruzione Try...Finally . Nell'esempio seguente vengono illustrati gli scheletri Try e Using le costruzioni equivalenti nell'acquisizione e nell'eliminazione di resource.
Using resource As New resourceType
' Insert code to work with resource.
End Using
' For the acquisition and disposal of resource, the following
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try
' Insert code to work with resource.
Finally
If resource IsNot Nothing Then
resource.Dispose()
End If
End Try
Annotazioni
Il codice all'interno del Using blocco non deve assegnare l'oggetto in resourcename a un'altra variabile. Quando si esce dal Using blocco, la risorsa viene eliminata e l'altra variabile non può accedere alla risorsa a cui punta.
Esempio
L'esempio seguente crea un file denominato log.txt e scrive due righe di testo nel file. L'esempio legge anche lo stesso file e visualizza le righe di testo:
Poiché le TextWriter classi e TextReader implementano l'interfaccia IDisposable , il codice può usare Using istruzioni per assicurarsi che il file venga chiuso correttamente dopo le operazioni di scrittura e lettura.
Private Sub WriteFile()
Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
writer.WriteLine("This is line one.")
writer.WriteLine("This is line two.")
End Using
End Sub
Private Sub ReadFile()
Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
Dim line As String
line = reader.ReadLine()
Do Until line Is Nothing
Console.WriteLine(line)
line = reader.ReadLine()
Loop
End Using
End Sub