C# 处理文件流和二进制读取器

C# 处理文件流和二进制读取器,c#,.net,C#,.net,我有一个类管理对二进制文件的访问。我希望在第一次请求时打开此文件,然后将其保持打开状态,直到我的类的实例被释放。我是这样实施的: public class SomeService : IDisposable { private BinaryReader _reader; public int ServiceFunction(...) { if (_reader == null) CreateReader(); /

我有一个类管理对二进制文件的访问。我希望在第一次请求时打开此文件,然后将其保持打开状态,直到我的类的实例被释放。我是这样实施的:

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
        }
    }
}
问题:

  • 调用
    \u reader.Dispose()
    就足够了,还是还需要明确地处理文件流
  • 如果我也需要处理文件流,我可以修改
    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\u stream
    中,稍后再处理此流


处理读取器将自动处理底层流,因此您无需显式处理。

处理读取器将自动处理底层流,因此您无需显式处理。

处理读取器就足够了

但这是因为读者有一个特殊的“特性”,它承担了流的所有权


因此,作为2个相关或不相关一次性用品的一般模式,它将不起作用。因此,为了安全和一致,我会将流存储为_流,并在最后处理它。当然不会痛的

处理读卡器就足够了

但这是因为读者有一个特殊的“特性”,它承担了流的所有权


因此,作为2个相关或不相关一次性用品的一般模式,它将不起作用。因此,为了安全和一致,我会将流存储为_流,并在最后处理它。当然不会痛的

BinaryReader.Dispose和StreamReader.Dispose的当前实现始终强制释放/关闭底层流。没有解决办法

但是:

Microsoft团队计划在下一版本的.NET中修复此问题


BinaryReader.Dispose和StreamReader.Dispose的当前实现总是强制底层流被释放/关闭。没有解决办法

但是:

Microsoft团队计划在下一版本的.NET中修复此问题


谢谢您的链接。我决定听从亨克·霍特曼的建议,明确地处理阅读器和流。该链接确认,为了将来的兼容性,这样做似乎是很好的,尽管目前它是多余的。谢谢这个链接。我决定听从亨克·霍特曼的建议,明确地处理阅读器和流。该链接证实,为了将来的兼容性,这样做似乎很好,尽管目前它是多余的。