Кто должен вызывать Dispose для объектов IDisposable при передаче в другой объект?

Есть ли какие-либо рекомендации или передовой опыт относительно того, кто должен вызывать 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 закончит его использовать. m в настоящее время думает, что в первом примере вызывающий из DoStuff () должен избавиться от объекта, поскольку он, вероятно, создал объект. Но во втором примере кажется, что MyClass должен удалить объект, поскольку он сохраняет ссылку на него. Проблема в том, что вызывающий класс может не знать, что MyClass сохранил ссылку, и поэтому может решить удалить объект до того, как MyClass закончит его использовать. m в настоящее время думает, что в первом примере вызывающий из DoStuff () должен избавиться от объекта, поскольку он, вероятно, создал объект. Но во втором примере кажется, что MyClass должен удалить объект, поскольку он сохраняет ссылку на него. Проблема в том, что вызывающий класс может не знать, что MyClass сохранил ссылку, и поэтому может решить удалить объект до того, как MyClass закончит его использовать. Есть ли какие-то стандартные правила для такого рода сценариев? Если есть, отличаются ли они, когда одноразовый объект передается в конструктор?

57
задан James Bateson 18 July 2017 в 09:22
поделиться