オブジェクトがGC.SuppressFinalizeを呼び出したかどうかを検出する方法はありますか?オブジェクトがGC.SuppressFinalizeを呼び出したかどうかを検出できますか?
私はこの(わかりやすくするために省略さ本格的にDisposeパターン)のようになりますオブジェクトがあります。ownsResource
コンストラクタのパラメータがfalse
である場合には、ファイナライザは何の関係もないだろう
public class ResourceWrapper {
private readonly bool _ownsResource;
private readonly UnmanagedResource _resource;
public ResourceWrapper(UnmanagedResource resource, bool ownsResource) {
_resource = resource;
_ownsResource = ownsResource;
if (!ownsResource)
GC.SuppressFinalize(this);
}
~ResourceWrapper() {
if (_ownsResource)
// clean up the unmanaged resource
}
}
を - そうコンストラクタから右にGC.SuppressFinalize
を呼び出すことは妥当と思われます(ちょっと奇妙な場合)。しかし、この振る舞いは奇妙なので、私はXML文書のコメントでそれを書き留めておきたいと思っています。もし私がコメントするように誘惑されたら、単体テストを書くべきです。
しかしSystem.GCがにメソッドがオブジェクトのfinalizability(SuppressFinalize、ReRegisterForFinalize)を設定している間、私はオブジェクトのfinalizabilityを取得するために、任意の方法が表示されません。 Typemockを購入したり、自分のCLRホストを作成したりしていない、特定のインスタンスでGC.SuppressFinalizeが呼び出されたかどうかを問い合わせる方法はありますか?
どちらも良いアイデアですが、私は第2のものが好きです。「所有者」の責任を別のオブジェクトに移してください。 –
別のオブジェクトタイプを使用すると、IMHOが機能するときにはよりクリーンになります(つまり、リソースが所有されるかどうかをラッパーが認識し、その状態は決して変更されません)。両方のテクニックを利用できることは確かに便利です。上の編集で指摘したように、ファイナライザは実行前にデフォルトに設定されています。これはちょっとしたようですが、ほとんどのシナリオではおそらく問題にはなりません。 – supercat