如果使用“using”语句,是否需要在流或作者上调用Flush()?

问题描述:

我不知道我是否需要调用所使用的对象Flush(),如果我写的东西是这样的:如果使用“using”语句,是否需要在流或作者上调用Flush()?

using (FileStream...) 
using (CryptoStream...) 
using (BinaryWriter...) 
{ 
    // do something 
} 

难道他们总是自动刷新?何时using语句刷新它们,何时不会(如果可能发生)?

只要您离开使用块的范围,流就会关闭并丢弃。 Close()调用Flush(),所以你不需要手动调用它。

+0

使用收市话费的结束?我只知道它配置了流,而且我最终每次都调用close方法。 –

+9

这不是必需的,Dispose将始终关闭流,Close将首先冲洗流。 – nos

+1

@FelixCzylwik:如果使用结束未调用关闭,您将有吨的开放流和打开SQLConnections那里...:D –

它有所不同,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