0

使用有什么缺点Using吗?我知道在Using块之外我将无法使用该资源,但在某些情况下我应该将其留给垃圾收集器吗?

这是一些带有嵌套usings 的示例代码。

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 块。即使发生任何异常,这也将确保其处置。

我应该把它留给垃圾收集器的情况?

一次性的。

该接口的主要用途是释放非托管资源。当不再使用该对象时,垃圾收集器会自动释放分配给托管对象的内存。但是,无法预测何时会发生垃圾收集。此外,垃圾收集器不了解非托管资源,例如窗口句柄或打开的文件和流。

于 2013-01-21T10:08:38.903 回答
2

如果一个对象实现了IDisposable,那么使用一个using块是没有害处的。

不过,您需要注意范围。如果您将一个对象添加到您打算稍后使用的 using 块内的列表中,那么如果您尝试访问该对象,您最终会遇到对象引用错误。

于 2013-01-21T10:26:14.933 回答
2

不,没有任何缺点,至少我知道。

每次处理具有本地生命范围的 Disposable 对象时,请使用using.

通过这种方式,您将受益,即使在using范围内出现异常的情况下,也会顺便调用 on Disposableobject Dispose(..),就像using没有别的一样,然后:

try {

}
finally {
}
于 2013-01-21T10:08:51.957 回答