我应该处理给我的IDisposable吗?

3
可能重复:
当传递到另一个对象中时,谁应该调用IDisposable对象上的Dispose? 假设你有一个带有以下接口的类:
public interface Foo
{
    Load(IDisposable something);
}

在实现这种方法时,完成后我应该调用dispose吗?换句话说,当一个类的方法使用StreamReader或其他可IDisposable的对象时,这个方法是否也应该处理流的释放,还是应该留给调用该方法的人来处理?

我知道两种方式都可以,只是好奇更有经验的人会认为哪种方式更合适 :-)


1
这取决于您接口的记录行为。 - sehe
1
你可能也想让 FooDisposable 继承。 - Tim Schmelter
如果它是可丢弃的,当你用完它时应该处理掉它。 - Jeremy Holovacs
4
通常情况下,释放对象的责任由调用方承担。被调用方无法知道调用方是否会尝试在之后重新使用该对象。 - Kevin Gosse
4个回答

3

不应该在Load方法中调用Dispose,因为您可能还需要使用IDisposable对象。如果您不需要更多,应在外部使用using来释放资源。示例代码:

using (var something = new Something())
{
    IFoo foo = new Foo();
    foo.Load(something);

    // Do more with something
}

0
如果您的对象包含其他本身是可处理的对象,则您的对象也应该是可处理的。例如,一个持有对以独占读/写权限打开的文件的引用的对象应该是可处理的,以便对象的客户端可以控制何时关闭或清理底层资源。让Foo接口继承IDisposable。

只有在“Foo”对象在方法结束后仍将保留对“IDisposable”对象的引用时,才适用此规则。如果它仅在该方法的上下文中使用它,则不适用此规则。 - Servy

0

这取决于您接口的文档行为。

如果对于调用者来说保持流处于“(重新)使用”状态是有意义的,那么您可以将其保持在某个已记录的状态下(例如,在某个块之后具有当前位置)。

否则,对用户最有帮助的做法似乎是处理它。

请注意,CLR框架类有时会有专门的重载,允许调用者指定应该发生什么。例如,请参见:http://msdn.microsoft.com/en-us/library/gg712952.aspx

public StreamReader(
    Stream stream,
    Encoding encoding,
    bool detectEncodingFromByteOrderMarks,
    int bufferSize,
    bool leaveOpen
)

0
我会添加一个参数,这样调用者就可以告诉我是否要处理它(我还为方法返回类型添加了void):
public interface Foo 
{ 
    void Load(IDisposable something, bool disposeSomething); 
} 

这不是特别常见的做法。通常在上下文中处理参数与否是有意义的(如果不确定,通常会倾向于“不处理”)。如果您想让调用者决定,那么您可能干脆不要处理它,并让他们在方法调用之后进行处理。 - Servy
@Servy 对的,但是强制开发人员传递布尔值意味着我知道开发人员知不知道这个方法将处理对象。如果我只在文档中放置这些信息,那么我就要求开发人员阅读文档。 - phoog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接