0

使用することのデメリットはありますUsingか?ブロックの外ではUsingそのリソースを使用できないことは理解していますが、ガベージコレクターに任せるべき状況はありますか?

ネストされたsを使用したサンプルコードを次に示しますusing

Dim ftpReq As FtpWebRequest = Nothing

subSetupFtp(ftpReq, WebRequestMethods.Ftp.ListDirectory) 'Setup FTP

    Dim lstFileNames As New List(Of String)

    'Get FTP response
    Using webRes As WebResponse = ftpReq.GetResponse()
    'read filenames into list to return
        Using ftpStream As New StreamReader(webRes.GetResponseStream())
            Do While ftpStream.Peek <> -1
                lstFileNames.Add(ftpStream.ReadLine)
            Loop
            lstFileNames.Sort() 'alphabetically sorts the list(a-z) ie. The files are now in date order

            'Tidy up
            ftpStream.Close()
            webRes.Close()
        End Using
    End Using
4

3 に答える 3

3

オブジェクトにthenで実装されたIDisposableがある場合は、それをで使用することをお勧めします。これはUsing、内部でtry/finallyブロックとして機能します。これにより、例外が発生した場合でも確実に廃棄できます。

ガベージコレクターに任せるべき状況は?

IDisposable

このインターフェースの主な用途は、管理されていないリソースを解放することです。ガベージコレクタは、管理対象オブジェクトが使用されなくなると、そのオブジェクトに割り当てられたメモリを自動的に解放します。ただし、ガベージコレクションがいつ発生するかを予測することはできません。さらに、ガベージコレクターは、ウィンドウハンドル、開いているファイルやストリームなどの管理されていないリソースについての知識を持っていません。

于 2013-01-21T10:08:38.903 に答える
2

いいえ、少なくとも私には、マイナス面はありません。

ローカルの寿命を持つ使い捨てオブジェクトを扱うときはいつでも、を使用してusingください。

usingこのようにして、スコープ内の例外の場合でも、他に何もないように、Disposableオブジェクト上Dispose(..)が呼び出されるという利点があります。using

try {

}
finally {
}
于 2013-01-21T10:08:51.957 に答える
2

オブジェクトが実装されている場合、ブロックIDisposableを使用しても害はありません。using

ただし、スコープに注意する必要があります。後で使用する予定のusingブロック内のリストにオブジェクトを追加する場合、そのオブジェクトにアクセスしようとすると、オブジェクト参照エラーが発生します。

于 2013-01-21T10:26:14.933 に答える