【问题标题】:Disposing FileStream and BinaryReader处理 FileStream 和 BinaryReader
【发布时间】:2011-04-29 18:40:40
【问题描述】:

我有一个类管理对二进制文件的访问。我想在第一次请求时打开这个文件,然后保持打开状态,直到我的类的实例被释放。我已经这样实现了:

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 中,然后再处理这个流吗?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    处理 _reader 就足够了。

    但这是由于阅读器的一个特殊“功能”,它假定了流的所有权。

    因此,作为 2 个相关或不相关的一次性用品的一般模式,它不会这样做。因此,我会将 Stream 存储为 _stream 并在最后处理它,只是为了安全和一致。肯定不会疼的。

    【讨论】:

      【解决方案2】:

      处置阅读器将自动处置底层流,因此您无需显式执行此操作。

      【讨论】:

        【解决方案3】:

        BinaryReader.Dispose 和 StreamReader.Dispose 的当前实现总是强制底层流被 Disposed/Closed。没有解决方法。

        但是:

        Microsoft 团队计划在 .NET 的下一版本中解决此问题。

        http://connect.microsoft.com/VisualStudio/feedback/details/361389/allow-binaryreader-and-streamreader-to-wrap-a-stream-without-disposing-it

        【讨论】:

        • 感谢您提供此链接。我决定听从 Henk Holterman 的建议,明确地处理阅读器和流。该链接确认这样做似乎对未来的兼容性很有好处,尽管目前它是多余的。
        猜你喜欢
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        相关资源
        最近更新 更多