可能重复:
Who should call Dispose on IDisposable objects when passed into another object?
假设您有一个具有如下界面的类:
public interface Foo
{
Load(IDisposable something);
}
实施此方法时,我应该在完成后调用dispose吗?换句话说,当一个类的方法采用Stream
,Reader
或其他任何IDisposable
时,该方法是否应该处理该流,或者应该将其留给谁叫这个方法?
我知道无论哪种方式都有效,只是好奇其他人更有经验会考虑好的行为: - )
答案 0 :(得分:3)
您不应在Dispose
方法中调用Load
,因为您可能会使用IDisposable
对象执行更多操作。如果您不需要更多,using
应该使用外部处理。示例代码:
using (var something = new Something())
{
IFoo foo = new Foo();
foo.Load(something);
// Do more with something
}
答案 1 :(得分:0)
这取决于您的界面记录的行为。
如果流保持开放以便(重新)使用'通过调用者,你可以在一些记录状态下将其保持打开状态(例如,在此类阻止之后的当前位置)。
否则,最有用的事情似乎是为用户处理它。
请注意,CLR框架类有时会有专门的重载,以允许调用者指定应该发生的事情。参见例如:http://msdn.microsoft.com/en-us/library/gg712952.aspx
public StreamReader(
Stream stream,
Encoding encoding,
bool detectEncodingFromByteOrderMarks,
int bufferSize,
bool leaveOpen
)
答案 2 :(得分:0)
我会添加一个参数,所以调用者可以告诉我是否要处置它(我还为方法返回类型添加了void
):
public interface Foo
{
void Load(IDisposable something, bool disposeSomething);
}
答案 3 :(得分:0)
如果你的对象包含其他本身是一次性的对象,那么你的对象也应该是一次性的。例如,一个持有对具有独占读/写权限打开的文件的引用的对象应该是一次性的,以便客户端对象可以控制何时关闭或清理底层资源。使Foo接口继承自IDisposable