2011-10-10 40 views

回答

42

只要您離開使用塊的範圍,流就會關閉並丟棄。 Close()調用Flush(),所以你不需要手動調用它。

+0

使用收市話費的結束?我只知道它配置了流,而且我最終每次都調用close方法。 –

+9

這不是必需的,Dispose將始終關閉流,Close將首先沖洗流。 – nos

+1

@FelixCzylwik:如果使用結束未調用關閉,您將有噸的開放流和打開SQLConnections那裏...:D –

0

它有所不同,Stream默認情況下不會調用Flush()中的Dispose方法,但有一些例外,如FileStream。原因是一些流對象不需要調用Flush,因爲它們不使用緩衝區。有些(例如MemoryStream)顯式重寫該方法以確保不採取任何操作(使其成爲無操作)。
這意味着如果你不想在那裏有額外的呼叫,那麼你應該檢查你使用的Stream子類是否實現了Dispose方法中的呼叫以及是否有必要。

無論如何,它可能是一個好主意,反正打電話只是爲了可讀性 - 有些類似於人們如何在他們using語句的末尾調用Close()

using (FileStream fS = new FileStream(params)) 
using (CryptoStream cS = new CryptoStream(params)) 
using (BinaryWriter bW = new BinaryWriter(params)) 
{ 
    doStuff(); 
    //from here it's just readability/assurance that things are properly flushed. 
    bW.Flush(); 
    bW.Close(); 
    cS.Flush(); 
    cS.Close(); 
    fS.Flush(); 
    fS.Close(); 
} 
+1

我認爲添加刷新和關閉調用會主動傷害可讀性和可維護性。 using語句就是保證對象被正確處理,即使在拋出異常的情況下也是如此。 – Palec

+0

@Palec我理解這個位置,這是我所見過的許多開發人員之間的一個劃分標準。 – TheHitchenator

+0

@Palec此外,正如我的答案中所述 - 默認情況下,流在其dispose方法中不調用Flush(),這意味着如果您使用的是由未考慮過的人創建的非標準流,那麼using語句不會正確地刷新緩衝區。正因爲如此,我認爲手動刷新是一種很好的做法 - 如果不需要,它將不會執行任何操作,但是如果是這樣,它將確保緩衝區正確處理。 – TheHitchenator

相關問題