Was ist der Zweck der using-Anweisung?
-
24-12-2019 - |
Frage
Auf der Grundlage dessen, was dazu geschrieben steht Website, und wenn ich das richtig verstehe, die using
Anweisung funktioniert wie eine try/finally
, also könnte ich fälschlicherweise erwarten, dass, wenn eine Ausnahme in a auftritt using
Anweisung, es sollte das Programm nicht zum Absturz bringen.
Wenn jedoch die DownloadString
Die im folgenden Beispiel gezeigte Methode löst a aus WebException
, das Programm stürzt ab.
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
Das ist normal, da die using
Aussage funktioniert nicht wie a try/catch/finally
, dann wird eigentlich keine Ausnahme behandelt.Aber dann frage ich mich, was der Zweck des ist using
Stellungnahme.
AKTUALISIEREN... Basierend auf den Antworten unten füge ich die folgenden Überlegungen hinzu.Wenn ich eine Ausnahme behandeln muss, könnten die möglichen Lösungen grundsätzlich wie folgt aussehen.
- Lege das
using
Aussage in atry/catch
Block. - Setzen Sie nur die
DonwloadString
Methode in atry/catch
Block. - Schreiben Sie manuell einen try/catch/finally-Block wie im folgenden Codebeispiel.
Beispielcode für die dritte Lösung.
WebClient client = new WebClient();
try
{
string response = client.DownloadString(url);
// ...
}
catch(Exception ex)
{
// handle (or ignore) the exception
}
finally
{
if (client != null)
client.Dispose();
}
Lösung
Wenn ich das richtig verstehe, funktioniert die using-Anweisung wie ein try/finally
Richtig.
Daher würde ich erwarten, dass das Programm nicht zum Absturz kommt, wenn in einer using-Anweisung eine Ausnahme auftritt.
Falsch.
Weder try/finally
noch using
Anweisungen schlucken Ausnahmen – wenn Sie die Ausnahme nicht abfangen, wird sie weitergegeben.Wenn es nicht abgefangen wird, wird der Prozess normalerweise abgebrochen.(Es gibt einige Fälle, in denen dies nicht der Fall ist, je nachdem, in welchem Thread es sich befindet und wie die CLR konfiguriert ist, aber das ist eine andere Sache.)
Aber dann frage ich mich, was der Zweck der using-Anweisung ist.
Um es einfacher zu machen, Code zu schreiben, der Ressourcen entsorgen muss.Das ist alles.Wenn wir es nicht getan hätten using
Aussagen, wir hätten eine viel von try
/finally
Blöcke, die gerade aufgerufen haben Dispose
...und das wäre wesentlich hässlicher.(Das habe ich schon gemacht – das war Java, bis Java 7 die try-with-resources-Anweisung einführte.)
Andere Tipps
A using
Die Anweisung lässt nicht alle Ausnahmen auf magische Weise verschwinden, sie bedeutet nur, dass die IDisposable.Dispose
Methode wird korrekt aufgerufen client
Einspruch erheben, wenn einer auftritt.Dies ist wichtig, um sicherzustellen, dass alle nicht verwalteten Ressourcen freigegeben werden.
Alle auftretenden Ausnahmen werden erneut ausgelöst, und Sie müssen sie weiterhin in Ihrem eigenen Code behandeln.
Siehe MSDN-Beschreibung von using
Stellungnahme
Kurz gesagt, die Verwendung gewährleistet dies .Dispose()
wird auch dann aufgerufen, wenn eine Ausnahme auftritt.Es hindert die Ausnahme jedoch nicht daran, ihre Aufgabe zu erfüllen.
Die Verwendung der Anweisung hat keinen Fang, nur ein schließlich und sodass die Ressource für Sie.Wenn die Verwendung von Anweisungen alle Ausnahmen ergreift und weiter läuft, wäre es ein großes Hindernis für das Debuggen.
Es ist einfach einfacher und schneller zu verwenden und zu lesen
Sehen Sie selbst
generasacodicetagpre.vs
generasacodicetagpre.Es sei einfach darauf sichergestellt, dass auf diesem Objekt das entsorgen wird.Die mit tun Sie keine Ausnahmeabwicklung, da der Versuch / endgültig nicht ist, entweder