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");