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

时间:2011-10-10 09:14:12

标签: c# stream using flush writer

如果我写这样的话,我不确定是否需要在使用过的对象上调用Flush()

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

它们是否总是自动刷新? using语句何时刷新它们以及何时不刷新(如果可能发生)?

2 个答案:

答案 0 :(得分:48)

一旦离开使用区块的范围,流就会关闭并处理掉。 Close()调用Flush(),因此您不需要手动调用它。

答案 1 :(得分:-2)

它有所不同,Stream默认情况下不会在Flush()方法中调用Dispose,但有一些例外情况,例如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();
}