3

別のUIスレッドを生成するクラスがあります。親クラスが破棄されるたびに、そのスレッドを中止してクリーンアップする必要があります。では、親クラスがいつ破壊されたかをどうやって知ることができますか?

C ++から来て、私の最初の考えはこれをデストラクタに入れることでした。しかし、C#には実際にはデストラクタはなく、ファイナライザとディスポーズだけがあります。これは、私が理解していることから、呼び出される場合と呼び出されない場合があります(GCのムードだと思いますか??)。

これは素晴らしくシンプルです。リソースを解放したいかどうかはわかりません。

しかし、オブジェクトが破棄されるたびに絶対的に積極的に実行する必要があるコードをどこに配置しますか?

4

4 に答える 4

5

それを入れて(インターフェースをDispose実装して) 、オブジェクトが不要になったときに呼び出されるようにします。これを行う言語構造があります:IDisposableDispose

using (var foo = new Foo())
{
    // Do something with foo.
}

foo.Disposeusingブロックの最後に呼び出されます。これは次と同等です。

{
    var foo = new Foo();
    try
    {
        // Do something with foo.
    }
    finally
    {
        foo.Dispose();
    }
}

オブジェクトがスコープを離れるときに自動的に呼び出されDisposeないことに注意してください。usingブロックを使用するか、明示的に呼び出すことによって、自分で行う必要があります。

Fooただし、その呼び出しでファイナライザーを提供する必要がありますDispose。これにより、GCがオブジェクトに到達する前にオブジェクトが破棄されない場合、解放されていないリソースが残されません。

~Foo()
{
    Dispose();
}

このパターンの背後にある考え方IDisposableは、クラスがいつ破棄する必要があるかを明確に伝えることです。これは、それを適切に実装する方法を説明する記事です(可能な子孫クラスを考慮に入れます)。

于 2013-01-22T22:11:37.017 に答える
3

オブジェクトが破壊されたときに何かが「絶対に積極的に[実行される]」ことを保証する方法はありません(PCのプラグを抜いてみてください---ファイナライザーは呼び出されません)

期待できる最善の方法は、ファイナライザーです。C++デストラクタ構文を使用してC#で定義されています。ただし、IDisposableを実装し、using{}ブロックを使用することをお勧めします。

于 2013-01-22T22:14:27.593 に答える
1

このメソッドを使用することは一般的ではありませんが、次~のように、文字を使用してC#で「デストラクタ」を定義できます。

class Parent
{
    ~Parent()  // destructor
    {
        // cleanup statements...
    }
}

ノート:

デストラクタは、オブジェクトの基本クラスでFinalizeを暗黙的に呼び出します。

ソース

于 2013-01-22T22:13:29.063 に答える
0

クラスをaComponentにし、それを含むクラスをaにしContainerます。

参照:C#-コンポーネントとは何ですか?通常、どのように使用されますか?

他の回答は、「範囲外」のユースケースで忙しいようです。しかし、「私の親クラスが破壊されるときはいつでも」?「親クラス」が「包含オブジェクト」である場合、コンポーネント適切なツールです。

于 2013-01-22T22:13:13.960 に答える