Anweisung mit try catch verwenden. Was passiert mit der Verwendung einer Anweisung?

8

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.

    
CSharpened 03.09.2012, 10:21
quelle

5 Antworten

9

Sie können sich using als eine Abkürzung für try-finally vorstellen. Daher entspricht Ihr Code:

%Vor%

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 .

    
Jon Hanna 03.09.2012, 10:25
quelle
7
  

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)

Von MSDN-Using-Anweisung

  

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.

    
Habib 03.09.2012 10:22
quelle
3

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.

Von MSDN-Using-Anweisung

  

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.

    
cspolton 03.09.2012 10:23
quelle
3

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.

    
Mr. Mr. 03.09.2012 10:24
quelle
2

Ihr using Code entspricht

%Vor%

Eine using-Anweisung, die hauptsächlich in drei Teile unterteilt ist, d. h.

  1. Akquisition
  2. Verwendung
  3. Entsorgung

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.

    
Akash KC 03.09.2012 10:26
quelle

Tags und Links