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

本文关键字:调用 Flush using 语句 是否 如果 | 更新日期: 2023-09-27 18:10:54

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

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

它们总是自动冲洗吗?using语句什么时候清除它们,什么时候不清除(如果可能的话)?

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

一旦离开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();
}