5

ここでは「using」を使用しているため、TRY のどこかに例外がある場合、FtpWebRequest、FtpWebRespons、および responseStream は自動的に閉じられますか?

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
4

3 に答える 3

8

はい、3 つすべてが閉じられます。

このステートメントは、実装するクラスUsingのメソッドを呼び出すことになります(これは、コンパイラが生成するセクションで発生します)。この場合、これらのクラスはが呼び出されると閉じます。DiposeIDisposableFinallyDispose

これには例外がほとんどありません。プロセスが終了した場合 (たとえば、ステートメントEnvironment.Exitの本文で呼び出すことによって)、ブロックと破棄は行われません。UsingFinally

于 2012-11-02T16:47:21.387 に答える
6

はい、スタック オーバーフローが発生した場合を除き、それらは破棄されます。ドキュメントから:

Using ブロックは、Try...Finally 構成のように動作し、Try ブロックがリソースを使用し、Finally ブロックがそれらを破棄します。このため、ブロックを終了する方法に関係なく、Using ブロックはリソースの破棄を保証します。これは、StackOverflowException を除いて、未処理の例外の場合にも当てはまります。

于 2012-11-02T16:49:11.827 に答える
5

それらは「自動的に」破棄されます。開くことができるものを破棄することで閉じる場合は、はい。

于 2012-11-02T16:47:02.663 に答える