当我"使用"BinaryReader对象时,为什么要丢弃我的FileStream对象?

rav*_*ven 4 .net using-statement objectdisposedexception

考虑以下功能:

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

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

ang*_*son 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();
    }
}
Run Code Online (Sandbox Code Playgroud)