关于清理责任的API设计困境

时间:2011-11-01 12:58:28

标签: c# api

假设您有一个库,它提供了一个接受需要清理的对象的方法。例如。通过调用其Close或Dispose方法。谁应该负责?来电者还是被叫者?当然,只要您正确记录,您就可以选择任何一种方式。但对此有共识或最佳实践吗?

以下是一个例子:

// public method of library
public class MyObject
{
   public void Read(System.IO.Stream stream)
   {
      ...
   }
   ...
}

如果调用者负责,客户端代码应如下所示:

using (FileStream file = new FileStream(...))
{
   MyObject myObject = new MyObject();
   myObject.Read(file);
}

2 个答案:

答案 0 :(得分:5)

我会说正常“所有权”适用于创建资源的人 - 所以你的方法的调用者。除了其他任何事情,谁会说调用者想要在阅读后处理流?也许他们想要将其倒回并将其传递给其他人。

我一般都对处理我没有明确创建的任何东西感到紧张。当然也有例外 - Bitmap(Stream)构造函数有效地获取流的所有权,并假设你将处理位图,而位图又将处理流...但我会说这是例外而不是规则。

答案 1 :(得分:2)

一般情况下,调用者应该清理,因为你不知道调用者是否真的完成了他的对象。

但是,如果您的方法“消耗”对象使得调用者无法再次使用它(例如,如果它读取了不可搜索的流),那么您可能想要自己处理它。