【问题标题】:Do we need to close a C# BinaryWriter or BinaryReader in a using block?我们是否需要在 using 块中关闭 C# BinaryWriter 或 BinaryReader?
【发布时间】:2009-07-03 13:46:46
【问题描述】:

拥有此代码:

using (BinaryWriter writer = new BinaryWriter(File.Open(ProjectPath, FileMode.Create)))
{
   //save something here
}

我们需要关闭 BinaryWriter 吗?如果不是,为什么?

【问题讨论】:

  • 尽管它是不同的类型,但它是 stackoverflow.com/questions/1070667/… 的副本。我会投票关闭,但已达到我当天的限制。我建议我们不需要为每个实现它的类提出“我应该处置一个实现 IDisposable 的类”的问题。请考虑投票结束作为您最喜欢的 IDisposable 问题的副本。
  • 这真的让你认为这是一个文档/API 设计缺陷:当你犯明显错误时编译器应该警告你,并且文档应该清楚地标明哪些 Close() 调用等效于 Dispose (并且最好不要有任何这样的 Close() 调用,它们首先是完全冗余的)。

标签: c# idisposable using


【解决方案1】:

只要它全部包含在 using 块中,那么您就不需要显式调用 Close

using 块将确保对象被释放,CloseDispose 方法在 BinaryWriter 上可以互换。 (Close 方法只是在后台调用Dispose。)

【讨论】:

    【解决方案2】:

    根据您的代码示例将其放入 using 语句将调用 Dispose,它会关闭底层流,所以不会。您可以通过 Reflector 看到这一点:

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            this.OutStream.Close();
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用您那里的代码,一旦退出 using 块,它将关闭文件,因此您无需显式调用 close。

      不使用 using 语句的唯一原因是,如果您希望在完成 BinaryWriter 后文件仍然处于打开状态,在这种情况下,您应该保留它的引用而不是将其传递给构造函数像这样。

      【讨论】:

        【解决方案4】:

        using 块将自动关闭二进制写入器并将其置于待 GC 状态。使用块是自己进行异常处理和关闭流的语法糖。

        【讨论】:

          【解决方案5】:

          通过将编写器包装在 using 块中,当编写器被释放时,将自动关闭。所以在这种情况下,您不需要显式关闭编写器。

          【讨论】:

            猜你喜欢
            • 2016-05-26
            • 1970-01-01
            • 2011-11-08
            • 1970-01-01
            • 2018-08-21
            • 2015-07-24
            • 1970-01-01
            • 2018-08-25
            • 2017-03-23
            相关资源
            最近更新 更多