6

これらの状況でいつデストラクタが呼び出されるのか、メインの UI スレッドで呼び出されるのか疑問に思っていました。

次のコードがあるとしましょう。デストラクタはいつ呼び出され、すべての関数呼び出しが完了するまで待機しますか?

private void Foo()
  {
  MyObject myObj = new MyObject();
  DoSomeFunThingsWithMyObject(myObj);

  myObj = new MyObject(); //is the destructor for the first instance called now?
  DoLongOminousFunctionality(myObj);  
  }
  //Or will it be called after the DoLongOminousFunctionality?

スレッドが myObj = new MyObject() で中断された場合、またはスレッドが解放されるまでデストラクタ呼び出しが待機する場合、それは私にとって興味深いものです。

情報のおかげで。

4

5 に答える 5

17

デストラクタは、ガベージ コレクタがいくつかの古いオブジェクトをクリーンアップする必要があると判断したときに呼び出されます。.NET でデストラクタの実行時間に依存することはできません

その代わりに、不要なリソースをクリーンアップしたい場合は Dispose() を使用する必要があります (特に、TCP 接続、SQL 接続などの管理されていないリソースがある場合)。

Dispose メソッドの実装を参照してください。

于 2009-08-11T10:55:35.597 に答える
3

オブジェクトの有効期間を管理することが重要な場合は、IDisposible から継承し、using キーワードを使用できます。

于 2009-08-11T10:58:41.567 に答える
2

名前が付けられているデストラクタまたはファイナライザは、インスタンスがガベージ コレクションで使用可能になった後、ある時点で呼び出されます。C++ のように決定論的な時点では発生しません。

于 2009-08-11T10:55:04.583 に答える
2

デストラクタ(またはファイナライザは、一部の人々がそれらを呼び出すことを好む)は、完全に別のスレッドで実行されます。それらは特定の時間に実行されません。アプリケーションの寿命が尽きるまでそれらがまったく実行される保証はありません。

于 2009-08-11T10:55:11.103 に答える
1

デストラクタ (ファイナライザ) は、オブジェクトが使用されなくなったことをガベージ コレクタが判断できるようになると呼び出されます。ファイナライザーは、メイン プログラムと同時にファイナライザー スレッドで実行されます。

適切な最適化 (JIT コンパイラーはローカル変数を簡単に削除できます) を使用すると、これは最初のDoSomeFunThingsWithMyObject 呼び出しの内部(そのメソッドがそのパラメーターを必要としなくなった後)、またはそれ以降の時点で発生する可能性があります。おそらく、プログラムがシャットダウンされるまで呼び出されません (まれに、ファイナライザーが呼び出されない場合もあります)。

于 2009-08-11T14:14:44.977 に答える