2013-01-21 64 views
0

使用Using有什麼不好嗎?我明白,除了Using塊以外,我不能使用該資源,但是在某些情況下,我應該將其留給垃圾回收器嗎?在.NET中,如果使用「使用」塊,有什麼缺點?

以下是嵌套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 
+3

小心問「我應該這樣做嗎?」問題 - 他們可能被認爲不具有建設性。 =) –

回答

3

如果對象已與當時實施IDisposable,它始終是更好地與Using使用它,在內部可以作爲一個try/finally塊。即使發生任何異常,這也將確保其處置。

我應該把它留給垃圾收集器的情況下?

IDisposable

此接口的主要用途是釋放非託管資源。 當不再使用該對象時,垃圾收集器會自動釋放分配給被管對象的內存。 但是, 無法預測垃圾回收何時發生。此外,垃圾收集器不知道非託管 資源,如窗口句柄或打開的文件和流。

+2

例外情況是,如果您要將對象返回給調用者。 –

2

不,沒有任何缺點,至少我知道。

每當您處理具有本地生活範圍的一次性對象時,請使用using

這樣,你將受益,即使在using範圍內之外,上Disposable對象Dispose(..)的情況下,將由方式調用,如using是不出意外的話:

try { 

} 
finally { 
} 
2

如果一個對象實現了IDisposable然後使用using塊沒有傷害。

儘管你需要小心範圍。如果您正在將一個對象添加到稍後打算使用的使用塊中的列表中,那麼如果嘗試訪問該對象,則最終會出現對象引用錯誤。

相關問題