2012-11-02 5 views
5

Da ich hier ein "using" benutze, wenn es eine Ausnahme gibt wo in der TRY werden FtpWebRequest, FtpWebRespons und responseStream automatisch geschlossen?Wenn es eine Ausnahme in der "Verwendung" gibt, wird sie automatisch geschlossen

Try 
Dim request As FtpWebRequest = CType(WebRequest.Create(""), FtpWebRequest) 
     request.Method = WebRequestMethods.Ftp.ListDirectoryDetails 

     request.Credentials = New NetworkCredential("", "") 
     Using response As FtpWebResponse = CType(request.GetResponse(), FtpWebResponse) 

      Using responseStream As Stream = response.GetResponseStream() 
       Using reader As New StreamReader(responseStream) 


        TextBox1.Text = reader.ReadToEnd 
        TextBox1.Text += vbNewLine 
        TextBox1.Text += vbNewLine 
        ' Use the + for appending (set the textbox to multiline) 

       End Using 

      End Using 

     End Using  

Catch ex As Exception 
    MessageBox.Show(ex.Message.ToString()) 
End Try 
+0

Um zu testen, dass sich, eine Klasse erstellen 'IDisposable' Implementierung und eine Nachricht an die Konsole in der' Dispose' Methode schreiben (oder einen Haltepunkt setzen) –

Antwort

6

Ja, sie werden entsorgt, außer wenn es einen Stack Overflow gibt. Vom documentation:

A Mit Block verhält sich wie ein Versuch ... Schließlich, in der Konstruktion der Try-Block die Ressourcen verwendet und die Schließlich verfügt sie blockieren. Aus diesem Grund garantiert der Using-Block die Entsorgung der Ressourcen , unabhängig davon, wie Sie den Block verlassen. Dies gilt auch für den Fall einer unbehandelten Ausnahme , außer für eine StackOverflowException.

5

Sie werden "automatisch" entsorgt; wenn die Entsorgung ein Ding schließt, das geöffnet werden kann, dann ja.

8

Ja, alle drei sind geschlossen.

Die Using Anweisung endet die Dipose Methode auf Klassen aufrufen, die IDisposable (dies geschieht in einem Finally Abschnitt, erzeugt der Compiler) implementieren. In diesem Fall werden diese Klassen geschlossen, wenn Dispose aufgerufen wird.

Es gibt nur wenige Ausnahmen von dieser Regel - wenn der Prozess beendet (etwa durch Environment.Exit im Körper der Using Aussagen Aufruf), dann wird der Finally Block und Entsorgung nicht passieren.

+0

@JamesMichaelHare - Prozess ... Dank. – Oded

+1

Hah, sorry, ich hätte klarer sein sollen, ich war mehr auf Exits vs existiert konzentriert ... –

+0

+1 aber "wenn der Prozess existiert" - Sie meinen, Exits nicht existiert – MarkJ

Verwandte Themen