2009-12-08 28 views
19

注:我已經閱讀了以下兩個問題已經:瞭解流和他們的壽命(沖洗,處置,關閉)

Can you explain the concept of streams?

C# using streams

我編碼在C#

  1. 在幾乎所有使用流的代碼示例中,幾乎總是調用.Dispose(),.Flush(),.Close()。
    • 在流的概念中,完成了什麼?
    • 如果我不處理存儲在變量中的流,我的應用程序是否在某處泄漏?
    • 爲什麼我需要調用這些函數中的任何一個?我見過的代碼示例,不這樣做,仍然把工作做好(無明顯破損)

我目前正在建設中的我的應用程序類,它包含一個主要方法(允許稱之爲GetStream()),返回經由myWebRequest.GetResponse().GetResponseStream()

GetStream()返回可用於需要流(StreamReader的,位圖()等等)的任何動作的Stream對象的主要方法的流。

有沒有辦法讓流在最後一次使用後自動處理(垃圾回收?)而不強制任何人調用.GetStream()來手動處理它?你可能會說,我的問題是模糊的,一般的。我對流的理解並不穩固,因此任何有用的文章鏈接都可以提供比流媒體更深入的視頻流,可以提供。

回答

28

處置流會關閉它(並且可能不會做太多其他操作)。關閉流會刷新流,並釋放與流相關的任何資源,如文件句柄。刷新數據流會獲取尚未寫入的任何緩衝數據,並立即將其寫出;有些流在內部使用緩衝來避免對磁盤文件或網絡管道等相對昂貴的資源進行大量小型更新。

您需要在大多數流上調用CloseDispose,或者您的代碼不正確,因爲底層資源不會被其他人使用,直到垃圾收集器到來(誰知道需要多長時間)當然優選Dispose;預計你會用C#處理所有的一次性東西。在大多數情況下,您可能不必明確呼叫Flush

在C#中,這是習慣用using塊,這是語法糖一個try-finally塊,在最終處置,例如方法來調用Dispose

using (FileStream stream = new FileStream(path)) 
{ 
    // ... 
} 

在功能上等同於

FileStream stream; 

try 
{ 
    stream = new FileStream(path); 
    // ... 
} 
finally 
{ 
    if (stream != null) 
     stream.Dispose(); 
} 
+2

最後應該是:'if(stream is IDisposable)((IDisposable)stream)。Dispose(); – Gonzalo 2009-12-08 04:34:07

+10

對未知IDisposable的變量使用'using'會出現編譯器錯誤。然而它應該在技術上是:if(stream!= null)stream.Dispose(); – 2009-12-08 06:39:19

+0

在許多情況下,即使還調用「Dispose」,顯式關閉流也是一個好主意。關閉流可能需要執行無法保證成功的操作;當發生這樣的問題時,'Close'的實現通常會拋出一個異常,而一些Dispose實現可能會扼殺這些異常(吞噬這些異常是邪惡的,但是允許它們從Dispose中傳播出去會經常破壞以前的異常,也是邪惡的;不同的邪惡被認爲是較小的)。 – supercat 2013-12-09 18:04:10