【问题标题】:Do you need to call Flush() on a stream or writer if you are using the “using” statement?如果您使用“using”语句,是否需要在流或写入器上调用 Flush()?
【发布时间】:2011-12-04 08:52:59
【问题描述】:

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

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

它们总是自动刷新吗? using 语句什么时候刷新它们,什么时候不刷新它们(如果可能发生的话)?

【问题讨论】:

    标签: c# stream using flush writer


    【解决方案1】:

    它会有所不同,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();
    }
    

    【讨论】:

    • 我认为添加刷新和关闭调用会主动损害可读性和可维护性。 using 语句确保对象被正确处理,即使在抛出异常的情况下也是如此。
    • @Palec 我理解这个立场,从我所看到的情况来看,这是许多开发人员之间的一种划分标准。
    • @Palec 另外,正如我的回答中所述 - 默认情况下,流不会在其 dispose 方法中调用 Flush(),这意味着如果您使用的是由没有“ t 认为然后 using 语句将不会正确刷新缓冲区。正因为如此,我想说手动刷新是一个好习惯——如果不需要,它不会做任何事情,但如果是的话,它将确保缓冲区被正确处理。
    【解决方案2】:

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

    【讨论】:

    • 结束使用呼叫关闭?我只知道它处理流,每次最后我都会调用close方法。
    • 没必要,Dispose 会一直关闭流,Close 会先flush流。
    • @FelixCzylwik:如果使用结束时没有调用 Close,那么您将拥有大量打开的流并打开 SQLConnections... :D
    • @FelixC 许多编译器不需要的东西仍然有助于提高可读性。
    • 相关:Does Stream.Dispose always call Stream.Closecaveat 隐式刷新只是通常的行为,不是由 Stream 类本身实现的(所以在扩展它时要小心)。
    猜你喜欢
    • 2012-08-15
    • 2015-11-26
    • 1970-01-01
    • 2013-06-08
    • 2016-12-05
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多