次のような状況があります。
AList<WeakReference<MyClass>>
にMyClass
は、 というイベントがありMyEvent
ます。リストを反復処理し、すべての有効な参照に対して、そのMyEvent
ターゲットで を呼び出す可能性があります。
コードの他の部分では、これらのオブジェクトへのライブ参照を保持しています。プロセスが次のようになっているとします。
var list = new List<WeakReference<MyClass>>();
var a = new MyClass();
a.MyEvent += delegate {
DoSomeStuff(a);
};
list.Add(new WeakReference<MyClass>(a));
ここで、 をもう使用しないa
と仮定して、処分することにします。だから今、a = null
.
無効な参照の元のリストをクリアする定期的なチェックのセットアップがあります。私が疑問に思っているのは、私が接続したこのイベント ハンドラーは、以前のa
インスタンスをMyClass
生きたままにして、リストからクリーンアップするのを妨げているのでしょうか?
イベントが単なる通常Action
の ではなく、Action<MyClass>
それ自体をパラメーターとしてハンドラーに渡した場合はどうなるでしょうか? ある意味では、ハンドラーが呼び出されない場合でも、そのハンドラーは元のオブジェクトへの参照を保持しています。
これは非常に明白かもしれません。答えを知っている同様の状況を考えることができますが、その関数をまさにそのオブジェクトにフックしているという事実は、私を疑わしくさせます。それが生き続けると、システム全体が壊れるので、知る必要があります.