Если у меня есть класс SomeDisposableObject
, который реализует IDisposable
:
class SomeDisposableObject : IDisposable
{
public void Dispose()
{
// Do some important disposal work.
}
}
И у меня есть еще один класс под названием AContainer
, который имеет экземпляр SomeDisposableObject
как общедоступное свойство:
class AContainer
{
SomeDisposableObject m_someObject = new SomeDisposableObject();
public SomeDisposableObject SomeObject
{
get { return m_someObject; }
set { m_someObject = value; }
}
}
Тогда FxCop будет настаивать на том, чтобы AContainer
также был сделан IDisposable
.
Это нормально, но я не вижу, как я могу безопасно вызывать m_someObject.Dispose()
из AContainer.Dispose()
, поскольку другой класс все еще может иметь ссылку на экземпляр m_someObject
.
Каков наилучший способ избежать этого сценария?
(Предположим, что другой код полагается на AContainer.SomeObject
, всегда имеющем ненулевое значение, поэтому простое перемещение создания экземпляра вне AContainer
не является опцией)
Изменить. Я расскажу о некоторых примерах, поскольку некоторые комментаторы пропустят эту проблему. Если я просто реализую метод Dispose()
на AContainer
, который вызывает m_someObject.Dispose(), то я оставлю следующие ситуации:
// Example One
AContainer container1 = new AContainer();
SomeDisposableObject obj1 = container1.SomeObject;
container1.Dispose();
obj1.DoSomething(); // BAD because obj1 has been disposed by container1.
// Example Two
AContainer container2 = new AContainer();
SomeObject obj2 = new SomeObject();
container2.SomeObject = obj2; // BAD because the previous value of SomeObject not disposed.
container2.Dispose();
obj2.DoSomething(); // BAD because obj2 has been disposed by container2, which doesn't really "own" it anyway.
Помогает ли это?