【问题标题】:Who should be responsible for closing a stream谁应该负责关闭流
【发布时间】:2011-04-13 22:27:14
【问题描述】:

我正在编写一个创建文件“目录”的应用程序,该目录可以归因于其他元数据文件,例如附件和缩略图。

我正在尝试将接口抽象为目录,以使目录的使用者不需要了解用于存储文件的底层文件系统。所以我创建了一个名为IFileSystemAdaptor 的接口,如下所示。

public interface IFileSystemAdaptor:IDisposable
{
    void WriteFileData(string fileName, Stream data);
    Stream ReadFileData(string filename);
    void DeleteFileData(string filename);
    void ClearAllData();
    void WriteMetaFileData(string filename, string path, Stream data);
    Stream ReadMetaFileData(string filename, string path);
    void DeleteMetaFileData(string filename, string path);
    void ClearMetaFilesData(string filename);
}

基本上,我的 IFileSystemAdaptor 接口公开了一个平面文件列表,这些文件也可以与其他元数据文件相关联。

如您所见,我正在使用对通用 Stream 对象的引用来将接口抽象为文件数据。这样,目录的一个实现可以从硬盘返回文件,而另一个可以从网络服务器返回数据。

现在我想弄清楚如何让我的程序不让流打开。对于哪些成员应该关闭流,是否有经验法则?流的消费者应该关闭它,还是应该由最初创建流的成员负责关闭它。

【问题讨论】:

    标签: c# .net stream


    【解决方案1】:

    在这种情况下,我的自发想法是消费者应该负责关闭流。 IFileSystemAdaptor 无法知道消费者何时使用完流,因此它也无法决定何时关闭它。

    【讨论】:

      【解决方案2】:

      实际上最后一个使用流的对象应该负责关闭它,通常是调用者。

      享受吧!

      【讨论】:

        【解决方案3】:

        我的规则:

        流的消费者是否应该关闭它

        1. 如果我从方法返回一个流,则由消费者负责。我把它给你,这是你的责任。

        2. 如果我接受一个流作为方法中的参数,我不会关闭它。退出方法时,不知道调用方法是否还需要。是你的直播,我只是借用,不想给你添麻烦。

        3. 如果我创建一个流并将其传递给另一个方法,我的方法会在我完成后关闭它(或尝试关闭它)。我不知道你打算怎么处理它,但这是我的信息流,所以我负责。

        【讨论】:

        • 通常是一组很好的规则,虽然我会添加第四个:当在构造函数或工厂方法中接受流(或其他IDisposable)时,如果构造的对象可能比其他任何人寿命更长实际上知道封装的流/对象,应该提供一个选项,让构造对象的Dispose方法也处理封装的流/对象。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多