2012-11-02 8 views
5

Perché sto usando un "utilizzo" qui, Se c'è un'eccezione in cui in TRY verranno automaticamente chiusi FtpWebRequest, FtpWebRespons e responseStream?se c'è un'eccezione nel "using" sarà automaticamente chiuso

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

Per verificare che te stesso, creare una classe che implementa 'IDisposable', e scrivere un messaggio alla console nel metodo' Dispose' (o mettere un punto di interruzione) –

risposta

6

Sì, verranno smaltiti, ad eccezione di quando si verifica un overflow dello stack. Dal documentation:

Un blocco Using si comporta come una prova ... Infine la costruzione in cui il blocco Try utilizza le risorse e il blocco finally dispone di loro. Per questo motivo, il blocco Utilizzo garantisce lo smaltimento delle risorse, indipendentemente da come si esce dal blocco. Questo è vero anche nel caso di un'eccezione non gestita , ad eccezione di StackOverflowException.

5

Saranno "automaticamente" smaltiti; se lo smaltimento chiude una cosa che può essere aperta, allora sì.

8

Sì, tutti e tre saranno chiusi.

L'istruzione Using finisce chiamando il metodo Dipose sulle classi che implementano IDisposable (questo avviene in una sezione Finally che il compilatore genera). In questo caso, queste classi si chiuderanno quando viene chiamato Dispose.

Ci sono pochissime eccezioni a questa - se le uscite di processo (dicono chiamando Environment.Exit nel corpo dei Using dichiarazioni), allora il blocco Finally e lo smaltimento non stanno per accadere.

+0

@JamesMichaelHare - Processo ... grazie. – Oded

+1

Hah, scusa, avrei dovuto essere più chiaro, ero più concentrato sulle uscite vs esiste ... –

+0

+1 ma "se il processo esiste" - vuoi dire che le uscite non esistono – MarkJ

Problemi correlati