Qual è lo scopo dell'istruzione usando?
-
24-12-2019 - |
Domanda
Sulla base di ciò che è scritto su questo Pagina Web , e se capisco correttamente, l'istruzione using
funziona come un try/finally
, quindi potrei erroneamente aspettare che se si verifica un'eccezione in un'istruzione using
, non dovrebbe bloccare il programma.
Tuttavia, quando il metodo DownloadString
, mostrato nell'esempio seguente, lancia un WebException
, il programma si blocca.
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
.
È normale, poiché l'istruzione using
non funziona come un try/catch/finally
, in realtà non viene gestita alcuna eccezione. Ma poi mi chiedo quale sia lo scopo dell'istruzione using
.
Aggiornamento ... In base alle risposte qui sotto, aggiungo le seguenti considerazioni. Fondamentalmente, se ho bisogno di gestire un'eccezione, le possibili soluzioni potrebbero essere le seguenti.
- .
- Metti l'istruzione
using
all'interno di un bloccotry/catch
. - Metti solo il metodo
DonwloadString
all'interno di un bloccotry/catch
. - Scrivi manualmente un blocco Try / Catch / Finalmente come nel seguente campione di codice.
Codice di esempio per la terza soluzione.
WebClient client = new WebClient();
try
{
string response = client.DownloadString(url);
// ...
}
catch(Exception ex)
{
// handle (or ignore) the exception
}
finally
{
if (client != null)
client.Dispose();
}
.Soluzione
.Se capisco correttamente, l'uso dell'utilizzo funziona come una prova / infine
corretto.
.Quindi mi aspetterei che se un'eccezione si verifica in una dichiarazione usando, non dovrebbe bloccare il programma.
errato.
Né try/finally
né le dichiarazioni using
ingoiare eccezioni - Se non prendi l'eccezione, si propaga. Se è non rilevato, di solito terminerà il processo. (Ci sono alcuni casi in cui non lo farà, in base a quale discussione è dentro e come è configurato il CLR, ma è una questione diversa.)
.Ma poi mi chiedo quale sia lo scopo dell'istruzione usando.
Per renderlo più semplice per scrivere il codice che deve disporre di risorse. È tutto. Se non avessimo dichiarazioni using
, avremmo avuto un lotto di blocchi try
/ finally
che hanno appena chiamato Dispose
... e questo sarebbe considerevolmente più brutto. (Stato lì, fatto quello - è stato Java fino a quando Java 7 ha introdotto la dichiarazione di prova con risorse.)
Altri suggerimenti
Un'istruzione using
non rende tutte le eccezioni che scompaiono magicamente, significa solo che il metodo IDisposable.Dispose
viene chiamato correttamente sull'oggetto client
se si verifica uno.Questo è importante per assicurarti che vengano rilasciate risorse non gestite.
ritornerà tutte le eccezioni che si verificano e dovrai comunque gestirle nel tuo codice.
Vedi MSDN Descrizione dell'istruzione using
In breve, l'utilizzo garantisce che .Dispose()
sia chiamato anche se si verifica un'eccezione.Non interrompe tuttavia l'eccezione di fare la sua cosa.
L'istruzione Uso non ha una cattura, solo un infine e quindi dispone della risorsa per te.Se l'uso dell'utilizzo dovesse catturare tutte le eccezioni e continuare a funzionare sarebbe un grande ostacolo al debug.
È semplicemente più facile e veloce da usare e leggere
Vedi per te
var myVar = null
try
{
my = new Object();
//Do stuff
}
finally
{
if(myVar != null)
myVar.Dispose()
}
.
vs
using(var myVar = new Object())
{
//Do stuff
}
.
Semplicemente per assicurarti che display è chiamato su quell'oggetto. usando non fare alcuna maneggevolezza di eccezione come prova / finalmente non è