假设您有一个库,它提供了一个接受需要清理的对象的方法。例如。通过调用其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);
}
答案 0 :(得分:5)
我会说正常“所有权”适用于创建资源的人 - 所以你的方法的调用者。除了其他任何事情,谁会说调用者想要在阅读后处理流?也许他们想要将其倒回并将其传递给其他人。
我一般都对处理我没有明确创建的任何东西感到紧张。当然也有例外 - Bitmap(Stream)
构造函数有效地获取流的所有权,并假设你将处理位图,而位图又将处理流...但我会说这是例外而不是规则。
答案 1 :(得分:2)
一般情况下,调用者应该清理,因为你不知道调用者是否真的完成了他的对象。
但是,如果您的方法“消耗”对象使得调用者无法再次使用它(例如,如果它读取了不可搜索的流),那么您可能想要自己处理它。