¿Quién debería llamar a Eliminar en objetos IDisposable cuando se pasa a otro objeto?

¿Hay alguna guía o mejores prácticas sobre quién debe llamar?Dispose() en objetos desechables cuando se han pasado a métodos o constructores de otro objeto?

Aquí hay un par de ejemplos de lo que quiero decir.

El objeto desechable se pasa a un método (¿debería deshacerse de él una vez hecho?):

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

    disposableObj.Dispose();
}

El objeto desechable se pasa a un método y se mantiene una referencia (en caso de que se elimine cuandoMyClass está dispuesto?):

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

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

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

Actualmente estoy pensando que en el primer ejemplo elllamador deDoStuff() debe deshacerse del objeto como probablemente lo creó. Pero en el segundo ejemplo se siente comoMyClass debe deshacerse del objeto ya que mantiene una referencia a él. El problema con esto es que la clase que llama puede no saberMyClass ha mantenido una referencia y, por lo tanto, podría decidir deshacerse del objeto antesMyClass ha terminado de usarlo. ¿Existen reglas estándar para este tipo de escenario? Si los hay, ¿difieren cuando el objeto desechable se pasa a un constructor?

Respuestas a la pregunta(5)

Su respuesta a la pregunta