【问题标题】:Why is my FileStream object being disposed of when I'm "using" a BinaryReader object?当我“使用” BinaryReader 对象时,为什么我的 FileStream 对象被丢弃?
【发布时间】:2011-07-12 18:42:15
【问题描述】:

考虑以下函数:

    private int GetSomethingFromFile(FileStream fs) 
    {
        using (BinaryReader br = new BinaryReader(fs))
        {
            fs.Seek(0, SeekOrigin.Begin);
            return br.ReadInt32();
        }
    }

FileStream 对象作为参数传入,BinaryReader 使用 using 语句声明。当我尝试使用该 FileStream 对象时,在调用此函数后,它会引发 System.ObjectDisposedException。为什么 FileStream 对象与 BinaryReader 对象一起被丢弃?

【问题讨论】:

标签: .net using-statement objectdisposedexception


【解决方案1】:

这是一个很好的问题,我不知道为什么会决定它应该是这样的,但遗憾的是它被记录为这样:

BinaryReader

Close:关闭当前阅读器和底层流

如果您查看this answer 到问题How do I “fork” a Stream in .NET?,那么您会看到他在名为MiscUtil 的库中引用了一个名为NonClosingStreamWrapper 的类,@Jon Skeet 编写了该类,您可以使用它来回绕流以防止它被关闭。

你会像这样使用它(例如):

private int GetSomethingFromFile(FileStream fs) 
{
    using (var wrapper = new NonClosingStreamWrapper(fs))
    using (BinaryReader br = new BinaryReader(wrapper))
    {
        fs.Seek(0, SeekOrigin.Begin);
        return br.ReadInt32();
    }
}

【讨论】:

  • 好吧,这很糟糕。调用该函数后,我需要该流。我只是应该违背推荐的做法并放弃 using 声明?
  • 老实说,无论哪种方式都是“hack”,要么放弃 using 语句,要么让包装类忽略该调用。不过,我自己一直在使用类似的包装器,所以我会这样做。
【解决方案2】:

因为释放二进制读取器会释放其底层流。

在调用者方法中使用“使用”。

原因随意:.NET类库就是这样实现的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 2019-04-19
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多