使用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
答案 0 :(得分:3)
如果一个对象已经用IDisposable实现了,那么最好将它与Using
一起使用,它在内部用作try / finally块。即使发生任何异常,这也将确保其处置。
我应该把它留给垃圾收集器的情况?
此接口的主要用途是释放非托管资源。 垃圾收集器自动释放分配给的内存 不再使用该对象时的托管对象。 然而,确实如此 无法预测何时会发生垃圾收集。 此外,垃圾收集器不知道不受管理 窗口句柄,打开文件和流等资源。
答案 1 :(得分:2)
不,没有任何缺点,至少我不知道。
每次处理具有当地生活范围的Disposable对象时,请使用using
。
通过这种方式,您将受益,即使在using
范围内的例外情况下,Disposable
对象Dispose(..)
上的using
也将被调用{{1}然后就是:
try {
}
finally {
}
答案 2 :(得分:2)
如果一个对象实现IDisposable
,则使用using
块没有任何危害。
你需要注意范围。如果要将对象添加到稍后要使用的使用块中的列表中,那么如果尝试访问该对象,则最终会出现对象引用错误。