我不确定在像这样写东西时是否需要调用使用的对象上的 Flush()
:
using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
// do something
}
它们是否总是自动刷新?什么时候using
语句会刷新它们,什么时候不会(如果可能的话)?
一旦您离开使用块的范围,流就会关闭和处理。Close()
调用Flush()
,因此您不需要手动调用它。
这个问题是不确定的,Stream
默认情况下在Dispose
方法中不会调用Flush()
,但有一些例外,比如FileStream
。原因是某些流对象不需要调用Flush
,因为它们不使用缓冲区。有些流对象,例如MemoryStream
,明确重写该方法以确保不执行任何操作(使其成为无操作)。
这意味着,如果您不想在其中添加额外的调用,则应检查您正在使用的Stream
子类是否在Dispose
方法中实现了该调用,以及是否有必要。
无论如何,出于可读性的考虑,最好还是调用它 - 就像有些人在使用语句结尾处调用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();
}
Flush()
方法,这意味着如果您正在使用某人创建的非标准流,并且该人员尚未考虑到这一点,则 using 语句将无法正确刷新缓冲区。因此,我认为手动刷新是一个好习惯 - 如果不需要任何操作,它就不会做任何事情,但如果需要,则会确保正确处理缓冲区。 - IAmJersh
close()
,和你的想法类似。但是在一个大项目中,有时我或另一个程序员没有放置关闭语句。这就导致了不确定是否需要在那里添加关闭语句。更糟糕的是,有时程序员觉得他们需要执行flush
然后执行close
。最终我删除了所有不需要的flush
和close()
行。一致的编码和了解系统如何工作(“使用意味着Dispose意味着Close意味着Flush”)也是“可读性”的一部分。 - ToolmakerSteve