17

WeakReference を使用する場合、.IsAlive 呼び出しと .Target 呼び出しの間でターゲットが収集されていないことをどのように確認できますか?

例えば:

if (myWeakReference.IsAlive)
{
    // How can we be sure the object is still alive while here?
    ((MyType)myWeakReference.Target).Foo();
}
4

4 に答える 4

29

を取得してTarget、null でないかどうかを確認します。

object target = myWeakReference.Target;
if (target != null)
{        
    ((MyType)target).Foo();
}

具体的に言うためのドキュメントIsAlive

IsAlive プロパティが true を返した直後にオブジェクトがガベージ コレクションのために再利用される可能性があるため、false の戻り値のみをテストする場合を除き、このプロパティの使用はお勧めしません。

于 2009-11-06T11:36:58.077 に答える
4

"IsAlive" プロパティの唯一の目的は、WeakReference のターゲットが既に破棄されている場合に何らかのアクションを実行したいが、誤ってそれを必要以上に長く存続させたくない場合です。たとえば、

  if (someWeakReference.Target == null)
    cleanup_related_object();

そしてガベージ コレクターが (何らかの理由で) someWeakReference.Target を評価したコードの直後にトリガーされると、GC はそのオブジェクトへの強い参照が存在することに気付き、そのコレクションを除外します。一方、次のように言います。

  if (!someWeakReference.IsAlive)
    cleanup_related_object();

someWeakReference ターゲットのターゲットの有効期間を誤って延長するリスクはありません。

于 2011-12-11T17:28:39.143 に答える
2

できません。myWeakReference.Target を変数に割り当て、null をチェックします。

于 2009-11-06T11:38:48.673 に答える