Wenn ich einen using-Block um eine try-catch-Anweisung habe, was passiert mit dem Objekt in dieser using-Anweisung, falls der catch eine Ausnahme auslöst? Betrachten Sie den folgenden Code:
%Vor%Wenn wir annehmen, dass Foo () fehlschlägt und die Ausnahme ausgelöst wird und das Programm effektiv bricht, wird databaseConnectivityObject entsorgt? Der Grund dafür ist, dass dem Objekt eine Datenbankverbindung zugeordnet ist.
Sie können sich using
als eine Abkürzung für try-finally vorstellen. Daher entspricht Ihr Code:
Wenn Sie auf diese Weise schauen, können Sie sehen, dass Dispose()
tatsächlich aufgerufen wird, wenn die Ausnahme ausgelöst wird, weil try-finally außerhalb des try-catch ist.
Genau deshalb verwenden wir using
.
wir gehen davon aus, dass Foo () fehlschlägt und die Ausnahme ausgelöst wird und effektiv unterbricht das Programm wird databaseConnectivityObject entsorgt?
Ja, wird es sein. Die interne Verwendung von try-finally
, (funktioniert nur für diejenigen, die IDisposable
implementieren)
Die using-Anweisung stellt sicher, dass Dispose aufgerufen wird, selbst wenn ein Ausnahme tritt auf, während Sie Methoden für das Objekt aufrufen. Sie können erzielen Sie das gleiche Ergebnis, indem Sie das Objekt in einen try-Block und dann Aufruf von Dispose in einem finally-Block; In der Tat, das ist wie Using-Anweisung wird vom Compiler übersetzt.
Ja, Ihr using
-Block wird das databaseConnectivityObject ablegen, unabhängig davon, ob Sie einen try-catch-Block haben.
Sie sagen zu Recht, dass der using-Block wichtig ist, und Sie sollten ihn für alle Klassen verwenden, die IDisposable
implementieren, um sicherzustellen, dass sie auch im Falle einer Ausnahme ordnungsgemäß entsorgt werden.
Die using-Anweisung stellt sicher, dass Dispose aufgerufen wird, selbst wenn ein Ausnahme tritt auf, während Sie Methoden für das Objekt aufrufen. Sie können erzielen Sie das gleiche Ergebnis, indem Sie das Objekt in einen try-Block und dann Aufruf von Dispose in einem finally-Block; In der Tat, das ist wie Using-Anweisung wird vom Compiler übersetzt.
Beim Implementieren des Blocks using
wird das Objekt in den Klammern entfernt, wenn es die Schnittstelle IDisposable
implementiert.
Es wird immer noch entsorgt, selbst wenn foo()
fehlgeschlagen ist.
Das Objekt in der using-Anweisung muss die IDisposable
-Schnittstelle implementieren.
Auch diese Fragen "Verwendungszwecke in cis" und "using statement vs try finally" sprechen Sie weiter über die Anwendungen und praktischen Aspekte der using
-Anweisung.
In Abschnitt 8.13 der C # -Sprachspezifikation wird die using-Anweisung ausführlich erläutert.
Ihr using
Code entspricht
Eine using-Anweisung, die hauptsächlich in drei Teile unterteilt ist, d. h.
Zuerst werden die Ressourcen erfasst und die Verwendung erfolgt im try-Block mit finally-Anweisung. Zuletzt wird das Objekt im finally-Block wie im obigen äquivalenten Code angegeben ... angeordnet.
Tags und Links .net c# using-statement