我不确定是否需要在使用的对象上调用Flush()
,如果我这样写:
using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
// do something
}
它们总是自动冲洗吗?using
语句什么时候清除它们,什么时候不清除(如果可能的话)?
一旦离开using块的作用域,流就关闭并被处理。Close()调用Flush(),所以你不需要手动调用它。
不同,Stream
默认不调用Dispose
方法中的Flush()
,少数例外,如FileStream
。这样做的原因是一些流对象不需要调用Flush
,因为它们不使用缓冲区。有些,如MemoryStream
显式覆盖该方法以确保不采取任何操作(使其成为no-op)。
这意味着,如果你不想在那里有额外的调用,那么你应该检查你正在使用的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();
}