50

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

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

他们总是自动冲洗吗?该using语句何时刷新它们,何时不刷新(如果可能发生)?

4

2 回答 2

62

一旦离开 using 块的作用域,流就会关闭并被释放。Close() 调用 Flush(),因此您不需要手动调用它。

于 2011-10-10T09:16:22.447 回答
-4

它会有所不同,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();
}
于 2018-01-23T10:02:32.883 回答