11

Q.オブジェクトに「強い参照」があるかどうかを確認する方法はありますか?


レイモンド・チェンは、解決策が可能かもしれないとほのめかしました:

参照カウントがゼロか非ゼロかを知りたい。そのためには、WeakReferenceを使用します。

ノート

  • オブジェクトへの「弱い参照」があります(WeakReferenceを使用)。私が強い参照を持っていた場合 、答えはすぐに次のようになります:「はい。あなたはオブジェクトへの強い参照を持っています。」
  • ガベージコレクターは答えを公開しません
  • IsAliveプロパティは、オブジェクトが収集されたかどうかのみを通知できます。それへの強い言及があるかどうかではありません。(参照のないオブジェクトは収集されない可能性があります-GCはまだそのオブジェクトに到達していません)
  • .NETのオブジェクトは参照カウントされません
  • すべてのオブジェクトがIDisposableインターフェースを実装する必要はありません
  • すべてのオブジェクトが私のものではありません

コードサンプル

このコードサンプルは、ガベージコレクションとWeakReferenceのIsAliveプロパティを強制して、オブジェクトに未処理の参照があるかどうかを判断する際の問題を示しています。

WeakReference m_wr = null;

...

for (int i = 0; i < 1000000; i++)
{
   Pig p = new Pig();
   m_wr = new WeakReference(p);
}

...

GC.Collect();
if (m_wr.IsAlive)
   Environment.FailFast("All objects should have been collected by now");
4

3 に答える 3

11

いいえ、デバッガーAPIを使用しないわけではありません。

あなたが言うように、オブジェクトは参照カウントされません...したがって、見つける唯一の方法はヒープをクロールすることです。これは通常、ガベージコレクションの一部として発生します。

「通常の」強力な参照がない場合でも、とにかくファイナライズの一部としてオブジェクトが復活する可能性があることに注意してください。ファイナライザーがある場合、ファイナライザーキューには事実上それへの参照があります。とにかく、その状況では、オブジェクトを「参照なし」として含めたくないかもしれません。

于 2010-08-12T17:16:23.803 に答える
3

昨日からの参照カウントに関するRaymondChenの投稿を読む必要があります。その後、それが本当に必要なことであるかどうか、そしてその理由を決定する必要があります。その後、戻ってきて理由を教えてください。

うーん、あなたは投稿を読んだようです-マイナーな詳細を吸収し、要点を逃しました。


データベース接続でDisposeを呼び出しても安全かどうか知りたいです。

ドキュメントを読んでください。 呼び出しを破棄します。 Closeは、好きなだけ電話をかけても大丈夫です。

アプリケーションは、Closeを複数回呼び出すことができます。例外は生成されません。

于 2010-08-12T17:21:44.480 に答える
3

最初に電話GC.Collect()してから確認してくださいWeakReference.IsAlive。そうである場合(つまり、 GC.Collecttrueを呼び出した後に収集されていない場合)、どこかに強力な参照があります。

于 2010-08-12T17:22:09.673 に答える