我正在编写一个创建文件“目录”的应用程序,可以将其归结为其他元数据文件,例如附件和缩略图。
我正在尝试将目录的接口抽象到目录的使用者不需要知道用于存储文件的基础文件系统的程度。所以我创建了一个名为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服务器返回数据。
现在我正在试图弄清楚如何防止我的程序离开流。成员应关闭流的是否有经验法则?如果流的消费者关闭它,或者原始创建流的成员是否应该负责关闭它。
答案 0 :(得分:14)
我的规则:
流的消费者是否应该关闭它
如果我从方法返回流,则消费者负责。我是给你的,这是你的责任。
如果我接受一个流作为方法中的参数,我不会关闭它。退出方法时,我不知道调用方法是否仍然需要它。这是你的流,我只是借用它,我不想搞砸你。
如果我创建一个流并将其传递给另一个方法,我的方法会在完成后关闭它(或尝试)。我不知道你会怎么做,但这是我的流,所以我对此负责。
答案 1 :(得分:2)
在这种情况下我的自发思想是消费者应该承担关闭流的责任。 IFileSystemAdaptor
无法知道消费者何时使用流完成,因此无法决定何时关闭消费者。
答案 2 :(得分:1)
实际上,使用流的最后一个对象应该负责关闭它,这通常是调用者。
享受!