13

これには 2 つの部分があります。

  1. 静的クラスが静的コンストラクターを持つことができる場合、なぜ静的デストラクタを持つことができないのでしょうか?

  2. 最善の回避策は何ですか? COM オブジェクトである接続のプールを管理する静的クラスがあり、プログラムの他の場所で何かが爆発した場合に接続が閉じられるか解放されるようにする必要があります。

4

4 に答える 4

19

静的クラスの代わりに、シングルトン パターンを持つ通常のクラスを使用する必要があります (つまり、クラス自体の 1 つの静的プロパティによって参照される可能性がある、クラスの 1 つのインスタンスを保持します)。次に、デストラクタ、またはさらに良いことに、デストラクタとDisposeメソッドの組み合わせを使用できます。

たとえば、次の場合:

static class MyClass
{
    public static void MyMethod() {...}
}

//Using the class:
MyClass.MyMethod();

代わりに次のようになります。

class MyClass : IDisposable
{
    public static MyClass()
    {
        Instance=new MyClass();
    }

    public static MyClass Instance {get; private set;}

    public void MyMethod() {...}

    public void Dispose()
    {
        //...
    }

    ~MyClass()
    {
        //Your destructor goes here
    }
}

//Using the class:
MyClass.Instance.MyMethod();

(静的コンストラクターでインスタンスが作成される方法に注意してください。静的コンストラクターは、クラスの静的メンバーのいずれかが最初に参照されるときに呼び出されます)

于 2009-11-26T19:45:08.013 に答える
7
  1. 静的クラスは破棄されないため、静的クラスにはデストラクタがありません。

  2. 複数のインスタンスを作成および破棄する場合は、静的であってはなりません。フルクラスにします。

  3. いずれにせよ、この目的でデストラクタを使用するべきではありません。IDisposable / Dispose を使用します。

于 2009-11-26T19:46:21.677 に答える
3

1.なぜ?--インスタンスのコンストラクターについて通常考える方法のように、型はコンストラクター自体を持つことはできません。一般に、「静的初期化子」メソッドとして知られることもありますが、Microsoft では「型コンストラクター」という用語を使用しています (これには特別な制限があります)。コードを挿入して型/クラスを初期化します。インスタンス コンストラクターの場合は、過負荷。「型コンストラクター」に対するこの静的な制限は、.NET CLR がクラス テンプレートをヒープにロードする責任があり、この状況ではパラメーターを指定できないためです (引数を渡す方法があるため)。最も厳密な意味では、プログラマーは型コンストラクターが呼び出されるようにする責任を負わないため、プログラマーが静的デストラクタをコーディングできるようにすることはあまり意味がありません。s は、CLR のドメインでより多くのことを行います。CLR は最終的にクラス テンプレートをヒープから削除しますが、クラス テンプレートの有効期間はそのインスタンスよりも長いため、とにかくリソースを集中的に使用することは望ましくありません (たとえば、db 接続を開いたままにするなど)。

2. 何?- シングルトン クラス テンプレートでリソースを開き、後でそれを破棄する必要があると思われる状況に陥った場合、シングルトン ソフトウェア パターンはそのクラスのインスタンスを 1 つだけ持ち、場合によってはSystem.IDiposableも実装すると考えることができます。デストラクタに加えて、クリーンアップを支援するインターフェイス。(誰かが IDisposable コード サンプルで私を打ち負かしたので、ここで解決策を終了します。)

于 2009-11-26T19:44:52.323 に答える
1

静的クラスが破棄されることはありません。プログラムとともに終了します。静的クラスを使用する代わりに、シングルトン パターンを実装として使用できます。

于 2009-11-26T19:50:09.053 に答える