オブジェクトが GC.SuppressFinalize を呼び出したかどうかを検出する方法はありますか?
次のようなオブジェクトがあります (明確にするために完全な Dispose パターンは省略されています)。
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
}
}
ownsResource
コンストラクターのパラメーターがの場合false
、ファイナライザーは何もする必要がありません。そのためGC.SuppressFinalize
、コンストラクターから直接呼び出すのが妥当なようです (少し変わっている場合)。ただし、この動作は風変わりなので、XML doc コメントに書き留めておきたいと思います...コメントしたい場合は、単体テストを作成する必要があります。
しかし、System.GCにはオブジェクトのファイナライズ可能性を設定するメソッド( SuppressFinalize、ReRegisterForFinalize ) がありますが、オブジェクトのファイナライズ可能性を取得するメソッドはありません。Typemock を購入するか、独自の CLR ホストを作成する以外に、特定のインスタンスで GC.SuppressFinalize が呼び出されたかどうかを照会する方法はありますか?