1. 程式人生 > >C#中 Flush Dispose和Close的區別!

C#中 Flush Dispose和Close的區別!

【個人學習過程記錄,不一定準確】

你寫了一個程式,其中要對硬碟上的一個檔案操作,FileStream fs = new FileStream(fileName)
這樣就是建立了一個檔案緩衝流,換句話的意思就是說你通過這條程式,計算機給了一一塊記憶體空間,但是呢這塊記憶體空間不是你想幹什麼就干涉麼的,他是專門存fileName這個檔案裡面的內容的,記憶體空間的大小,和其他資訊,簡單地操作時沒有辦法訪問的。當你要從檔案裡面讀取一個Int整數的時候,程式做的不僅僅是讀取一個int型整數,他會把該資料附近的一大塊資料都讀出來放在剛才的那塊空間中,為什麼這麼做呢,因為CPU訪問硬碟比訪問記憶體慢多了,所以一開始讀出很多的資料,後面需要使用的時候直接使用讀出來的,就防止了再次訪問
硬碟

相應的,你要網檔案裡面寫入資料,也是先存到這個記憶體裡,等存的東西足夠多了,或者過了足夠的時間,系統一次性把內容寫入硬碟。
Flush的作用就是強制執行了一次把資料寫出硬碟,這樣,你寫入的資料確實到了檔案中,否則如果程式突然中斷,你要寫入的內容也許還沒寫到檔案中,就造成了資料丟失。
(這個不是StreamWriter?StreamWriter是重寫的,StreamWriter在Close之後就釋放了,MSDN寫了會呼叫Dispose釋放所有資源)

Close後連線可以再次開啟;而Dispose後連線字串被清空,連線不能再開啟

綜上,關於它倆,得出淺顯結論:

1、Close負責關閉業務,Dispose負責銷燬物件。Dispose會負責Close的一切事務,額外還有銷燬物件的工作,即Dispose包含Close

2、當你有明確需求的時候,不要混用二者

3、兩者連在一起用沒什麼意義。要麼關閉~以便再次使用,要麼銷燬~不再使用


close暫時關閉 關閉當前流並釋放與之關聯的所有資源(如套接字和檔案控制代碼)。不直接呼叫此方法,而應確保流得以正確釋放。
flush把寫在緩衝區的內容寫入檔案
清理當前編寫器的所有緩衝區,並使所有緩衝資料寫入基礎流。
dispose清理記憶體 
釋放由 System.IO.Stream 使用的所有資源。
 檔案控制代碼當然要清理,非託管資源不及時清理會導致記憶體洩露