如果我有一个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()
from AContainer.Dispose()
,因为另一个类可能仍然有对该m_someObject
实例的引用。
避免这种情况的最佳方法是什么?
(假设其他代码依赖于AContainer.SomeObject
始终具有非空值,因此简单地将实例的创建移到外部AContainer
不是一种选择)
编辑:我将用一些例子进行扩展,因为我认为一些评论者错过了这个问题。如果我只是实现一个调用 m_someObject.Dispose() 的方法,那么我会遇到以下情况Dispose()
:AContainer
// 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.
这有帮助吗?