谁应该负责关闭流

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

我正在尝试将接口抽象到目录,以使目录的使用者不需要知道用于存储文件的基础文件系统。 所以我创建了一个名为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对象的引用来将接口抽象为文件的数据。 这样,Catalog的一个实现可以从硬盘返回文件,而另一个实现可以从Web服务器返回数据。

现在,我正在试图弄清楚如何防止我的程序离开流。 成员应关闭流的是否有经验法则? 如果流的消费者关闭它,或者原始创建流的成员是否应该负责关闭它。

我的规则:

流的消费者应该关闭它吗?

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

  2. 如果我接受一个流作为方法中的参数,我不会关闭它。 退出方法时,我不知道调用方法是否仍然需要它。 这是你的流,我只是借用它,我不想搞砸你。

  3. 如果我创建一个流并将其传递给另一个方法,我的方法关闭它(或尝试)当我完成它。 我不知道你会怎么做,但这是我的流,所以我对此负责。

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

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

请享用!