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; }
}
}
AContainer
それから FxCop は、それも行われていると主張しますIDisposable
。
これは問題ありませんが、別のクラスがまだインスタンスへの参照を持っている可能性があるため、m_someObject.Dispose()
から安全に呼び出す方法がわかりません。AContainer.Dispose()
m_someObject
このシナリオを回避する最善の方法は何ですか?
AContainer.SomeObject
(他のコードは常に null 以外の値を持つことに依存していると仮定すると、単にインスタンスの作成を の外に移動すること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.
それは役に立ちますか?