Есть ли какие-либо рекомендации или рекомендации по поводу того, кто должен называть Dispose()
на одноразовых объектах, когда они были переданы другим методам объектов или constuctor?
Вот несколько примеров того, что я имею в виду.
IDisposable object передается в метод (должен ли он избавиться от него после его завершения?):
public void DoStuff(IDisposable disposableObj)
{
// Do something with disposableObj
CalculateSomething(disposableObj)
disposableObj.Dispose();
}
Идентифицируемый объект передается в метод и сохраняется ссылка (должен ли он утилизировать его при 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
закончил его использование.
Существуют ли стандартные правила для такого рода сценариев? Если есть, отличаются ли они, когда одноразовый объект передается в конструктор?