我有一个管理二进制文件访问的类。我想在第一次请求时打开这个文件,然后保持打开状态,直到我的类的实例被处理掉。我已经像这样实现了它:
public class SomeService : IDisposable
{
private BinaryReader _reader;
public int ServiceFunction(...)
{
if (_reader == null)
CreateReader();
// Do something with _reader and return a result
}
private void CreateReader()
{
var stream = new FileStream("myFile", FileMode.Open, FileAccess.Read);
_reader = new BinaryReader(stream);
}
public void Dispose()
{
if (_reader != null)
_reader.Dispose();
}
}
然后我会这样使用这个类:
using (var service = new SomeService())
{
foreach (var item in someList)
{
// other stuff
if (eventuallyTrue)
{
int result = service.ServiceFunction(item.SomeProperty);
// other stuff
}
}
}
问题:
_reader.Dispose()
或者是否有必要明确处理FileStream?如果我也需要处理FileStream,可以像这样修改Dispose
方法:
public void Dispose()
{
if (_reader != null)
{
if (_reader.BaseStream != null)
_reader.BaseStream.Dispose();
_reader.Dispose();
// Does the order of disposing matter here ?
}
}
或者我是否需要将FileStream
保存在单独的类变量private FileStream _stream
中并稍后处理此流?
答案 0 :(得分:4)
处理_reader就足够了。
但这是因为读者特有的“特征”,它假定了流的所有权。
因此,作为2个相关或不相关的一次性用品的一般模式,它不会这样做。因此,我将Stream存储为_stream并将其最终处理,只是为了安全和一致。它肯定不会受到伤害。
答案 1 :(得分:2)
处理读取器将自动处理基础流,因此您无需明确地执行此操作。
答案 2 :(得分:2)
BinaryReader.Dispose和StreamReader.Dispose的当前实现始终强制将基础流设置为Disposed / Closed。没有解决方法。
可是:
Microsoft团队计划在下一版本的.NET中修复此问题。