4

考虑以下函数:

    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 对象一起被处置?

4

2 回答 2

8

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

BinaryReader

关闭:关闭当前阅读器和基础流

如果您查看如何在 .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();
    }
}
于 2011-03-10T14:36:39.777 回答
1

因为处置二进制阅读器处置其底层流。

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

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

于 2011-03-10T14:37:31.593 回答