考虑以下功能:
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对象一起被处理?
答案 0 :(得分:8)
这是一个非常好的问题,我不知道为什么决定它应该如何,但是有记录的是这样:
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();
}
}
答案 1 :(得分:1)
因为配置二进制阅读器会处理其底层流。
改为在调用者方法中使用“using”。
原因是任意的:.NET类库以这种方式实现。