如果使用“using”语句,是否需要在流或作者上调用Flush()?
我不知道我是否需要调用所使用的对象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 –