Quem deve chamar Dispose em objetos IDisposable quando passados para outro objeto?

Existe alguma orientação ou práticas recomendadas sobre quem deve ligarDispose() em objetos descartáveis quando eles foram passados para os métodos ou constituintes de outro objeto?

Aqui estão alguns exemplos do que quero dizer.

O objeto IDisposable é passado para um método (ele deve ser descartado assim que terminar?):

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

    disposableObj.Dispose();
}

O objeto IDisposable é passado para um método e uma referência é mantida (deve descartá-lo quandoMyClass está descartado?):

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

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

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

Atualmente, estou pensando que, no primeiro exemplo, ochamador doDoStuff() deve descartar o objeto, pois provavelmente o criou. Mas no segundo exemplo, parece queMyClass deve descartar o objeto, pois ele mantém uma referência a ele. O problema disso é que a classe de chamada pode não saberMyClass manteve uma referência e, portanto, pode decidir descartar o objeto antes deMyClass terminou de usá-lo. Existem regras padrão para esse tipo de cenário? Se houver, eles diferem quando o objeto descartável está sendo passado para um construtor?

questionAnswers(5)

yourAnswerToTheQuestion