我应该处理给我的IDisposable吗?

时间:2012-09-07 13:49:13

标签: c# io idisposable

  

可能重复:
  Who should call Dispose on IDisposable objects when passed into another object?

假设您有一个具有如下界面的类:

public interface Foo
{
    Load(IDisposable something);
}

实施此方法时,我应该在完成后调用dispose吗?换句话说,当一个类的方法采用StreamReader或其他任何IDisposable时,该方法是否应该处理该流,或者应该将其留给谁叫这个方法?

我知道无论哪种方式都有效,只是好奇其他人更有经验会考虑好的行为: - )

4 个答案:

答案 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