1

特定のクラス階層が IDisposable を実装するプロジェクトに取り組んでいます。

一部のクラスは Finalize メソッド ( ~MyClass() ) も実装しています。

一般に、次のようになります。

public class BaseClass : IDisposable
{
}

public class SomeClass : BaseClass
{
    ~SomeClass()
    {
        Dispose();
    }

    Dispose()
    {
        // Do some stuff.
        base.Dispose();
    }
}

public class AnoterClass : SomeClass
{
    ~AnoterClass()
    {
        Dispose();
    }

    Dispose()
    {
        // Do some stuff.
        base.Dispose();
    }
}

これらのオブジェクトは Dispose() を呼び出すことによって破棄され、後で Finalize メソッドが呼び出されるためクラッシュするように見えるため、Dispose の呼び出しを処理する適切な方法を知りたいです。

階層の最下位クラス (保護された bool が破棄される) にフラグを保持し、クラス階層のすべてのレベルでそれを確認するのが最善ですか?

考えられるすべての解決策には、コードの重複が必要であることがわかりましたが、これは私が求めているものではありません。

4

2 に答える 2

4

基本クラスが標準のIDisposableパターンを実装している場合、必要なのは、それ自体が所有する、または管理されていないリソースDispose(bool disposing)を所有する各派生クラスにオーバーライドを追加することだけです。IDisposable

protected override void Dispose(bool disposing)
{
    try
    {
        if (disposing)
        {
            // Release managed resources
        }
        // Release unmanaged resources
    }
    finally
    {
        base.Dispose(disposing);
    }
}

派生クラスのいずれにもファイナライザーを実装しないでください。

そしてもちろん、独自のIDisposableリソースを持たない階層内のクラスは、このオーバーライドを必要としません。

于 2012-10-20T12:12:29.390 に答える