3

可能重复:
当传递到另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?

假设您有一个具有如下接口的类:

public interface Foo
{
    Load(IDisposable something);
}

实现此方法时,我应该在完成后调用 dispose 吗?换句话说,当一个类的方法采用 a或任何其他是时Stream,该方法是否也应该处理流,还是应该留给调用该方法的人?ReaderIDisposable

我知道任何一种方式都会奏效,只是好奇其他更有经验的人会认为良好的行为:-)

4

4 回答 4

3

你不应该调用方法,因为你可能对对象做更多的Dispose事情。如果您不需要更多,应该使用外部处理。示例代码:LoadIDisposableusing

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

    // Do more with something
}
于 2012-09-07T13:57:51.550 回答
0

这取决于您的界面的记录行为。

如果流保持打开以供调用者“(重新)使用”是有意义的,那么您可以将其保持在某些记录状态(例如,在某某块之后的当前位置)。

否则,最有帮助的事情似乎是为用户处理它。

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

public StreamReader(
    Stream stream,
    Encoding encoding,
    bool detectEncodingFromByteOrderMarks,
    int bufferSize,
    bool leaveOpen
)
于 2012-09-07T13:51:42.440 回答
0

我会添加一个参数,所以调用者可以告诉我是否处理它(我还添加void了方法返回类型):

public interface Foo 
{ 
    void Load(IDisposable something, bool disposeSomething); 
} 
于 2012-09-07T13:54:51.557 回答
0

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

于 2012-09-07T13:55:35.373 回答