このMSDNページの最初
標準のDisposeパターンがあります。また、保護されたメソッドのパラメーターとしてブール値があり、Dispose
管理対象リソースが既に手動で解放されているかどうかをGCに通知するため、GCはそれらを気にする必要がありません。
if (disposing) {}
ここで問題は、ブロック内で正確に何をすべきかということです。通常、GCは管理対象リソースをクリーンアップするため、特別なことをする必要はありません。しかし、このブロック内では、管理対象リソースを明示的にクリーンアップする必要があるため、オブジェクト内のすべてのフィールドなどをに設定するだけでよいのnull
でしょうか。
第二に、その言語でデストラクタ(またはファイナライザーと呼ばれるもの)を1つだけ持つ方が良いのではないでしょうか。次に、GCの設計で、ガベージコレクションが不要になるようにデストラクタがすでに呼び出されているかどうか、またはデストラクタがまだ呼び出されておらず、GCがクリーンアップする必要があるかどうかを判断します。Disposeパターンは非常に複雑で、どの関数で何をクリーンアップするか、派生クラスでどのようにクリーンアップするかについて非常に混乱しています。また、サインルデストラクタ設計を使用することにより、GCは、まだクリーンアップされていないときにクリーンアップするだけで、すでにクリーンアップされているときはクリーンアップしません。
ご挨拶
PS:では、これもオブジェクトをクリーンアップするための優れたシンプルなパターンですか?
class Foo
{
bool unmanagedDisposed = false;
void Dispose() {/*clean up unmanaged resources*/ unmanagedDisposed = true;}
~Foo() {if (!unmanagedDisposed) Dispose();}
}
したがって、プログラマーが呼び出しを知っていて覚えている場合はDispose()
、ファイナライザーで何もしません。それ以外の場合は、ファイナライザーで管理されていないリソースをクリーンアップします。そして、ここでは、これらの管理対象リソースについて気にする必要はありません。