我不知道我是否需要調用所使用的對象Flush()
,如果我寫的東西是這樣的:如果使用「using」語句,是否需要在流或作者上調用Flush()?
using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
// do something
}
難道他們總是自動刷新?何時using
語句刷新它們,何時不會(如果可能發生)?
我不知道我是否需要調用所使用的對象Flush()
,如果我寫的東西是這樣的:如果使用「using」語句,是否需要在流或作者上調用Flush()?
using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
// do something
}
難道他們總是自動刷新?何時using
語句刷新它們,何時不會(如果可能發生)?
只要您離開使用塊的範圍,流就會關閉並丟棄。 Close()調用Flush(),所以你不需要手動調用它。
它有所不同,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();
}
我認爲添加刷新和關閉調用會主動傷害可讀性和可維護性。 using語句就是保證對象被正確處理,即使在拋出異常的情況下也是如此。 – Palec
@Palec我理解這個位置,這是我所見過的許多開發人員之間的一個劃分標準。 – TheHitchenator
@Palec此外,正如我的答案中所述 - 默認情況下,流在其dispose方法中不調用Flush(),這意味着如果您使用的是由未考慮過的人創建的非標準流,那麼using語句不會正確地刷新緩衝區。正因爲如此,我認爲手動刷新是一種很好的做法 - 如果不需要,它將不會執行任何操作,但是如果是這樣,它將確保緩衝區正確處理。 – TheHitchenator
使用收市話費的結束?我只知道它配置了流,而且我最終每次都調用close方法。 –
這不是必需的,Dispose將始終關閉流,Close將首先沖洗流。 – nos
@FelixCzylwik:如果使用結束未調用關閉,您將有噸的開放流和打開SQLConnections那裏...:D –