【发布时间】:2010-10-15 01:31:31
【问题描述】:
如果我有一个实现IDisposable 的SomeDisposableObject 类:
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。
这很好,但我不知道如何安全地从AContainer.Dispose() 调用m_someObject.Dispose(),因为另一个类可能仍然引用m_someObject 实例。
避免这种情况的最佳方法是什么?
(假设其他代码依赖于AContainer.SomeObject 总是有一个非空值,所以简单地将实例的创建移到AContainer 之外是不可行的)
编辑:我将通过一些示例进行扩展,因为我认为一些评论者错过了这个问题。如果我只是在 AContainer 上实现一个 Dispose() 方法,该方法调用 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.
这有帮助吗?
【问题讨论】:
-
将其设置为只读属性有助于使所有权更清晰,但当 AContainer 处置它时,另一个类仍然可以引用 m_SomeObject 实例。所以仍有引入错误的机会。
标签: c# .net dispose idisposable