在.NET中,如果使用'using'-block,有什么缺点?

时间:2013-01-21 10:07:07

标签: .net vb.net using

使用Using是否有任何缺点?我知道在Using块之外我不能使用该资源但是在那种情况下我应该把它留给垃圾收集器吗?

以下是一些嵌套using s。

的示例代码
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

3 个答案:

答案 0 :(得分:3)

如果一个对象已经用IDisposable实现了,那么最好将它与Using一起使用,它在内部用作try / finally块。即使发生任何异常,这也将确保其处置。

  

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

IDisposable

  

此接口的主要用途是释放非托管资源。   垃圾收集器自动释放分配给的内存   不再使用该对象时的托管对象。 然而,确实如此   无法预测何时会发生垃圾收集。   此外,垃圾收集器不知道不受管理   窗口句柄,打开文件和流等资源。

答案 1 :(得分:2)

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

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

通过这种方式,您将受益,即使在using范围内的例外情况下,Disposable对象Dispose(..)上的using也将被调用{{1}然后就是:

try {

}
finally {
}

答案 2 :(得分:2)

如果一个对象实现IDisposable,则使用using块没有任何危害。

你需要注意范围。如果要将对象添加到稍后要使用的使用块中的列表中,那么如果尝试访问该对象,则最终会出现对象引用错误。