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