一尘不染

传递给另一个对象时,谁应该对IDisposable对象调用Dispose?

c#

Dispose()在将一次性对象传递到另一个对象的方法或构造函数中后,谁应该调用这些对象,是否有任何指导或最佳做法?

这里有一些关于我的意思的例子。

IDisposable对象被传递到方法中(完成后是否应将其处置?):

public void DoStuff(IDisposable disposableObj)
{
    // Do something with disposableObj
    CalculateSomething(disposableObj)

    disposableObj.Dispose();
}

IDisposable对象被传递到方法中并保留引用(在处理时是否应将其处理MyClass?):

public class MyClass : IDisposable
{
    private IDisposable _disposableObj = null;

    public void DoStuff(IDisposable disposableObj)
    {
        _disposableObj = disposableObj;
    }

    public void Dispose()
    {
        _disposableObj.Dispose();
    }
}

我目前认为在第一个例子中, 呼叫者
DoStuff(),因为它可能创建的对象应该处理的对象。但是在第二个示例中,感觉就像MyClass应该处理该对象,因为它保留了对它的引用。这样做的问题在于,调用类可能不知道MyClass保留了引用,因此可能决定MyClass在使用完该对象之前决定处置该对象。对于这种情况有任何标准规则吗?如果有,当将一次性对象传递给构造函数时,它们是否有所不同?


阅读 381

收藏
2020-05-19

共1个答案

一尘不染

一般规则是,如果您创建(或获得了)对象的所有权,则有责任处置它。这意味着,如果您在方法或构造函数中收到一次性对象作为参数,则通常不应处置它。

请注意,.NET框架中的某些类 确实会 处置它们作为参数接收的对象。例如,StreamReader配置a 也配置基础Stream

2020-05-19