私は現在 WPF を学んでおり、弱いイベントの概念に出くわしましたが、「それを理解する」のに本当に苦労しています。私は Stackoverflow に関する数え切れないほどの記事を読み、コード サンプルを見てきましたが、うまく理解できていません。
ここに私のジレンマがあります:
- オブジェクトがイベントをサブスクライブする場合、イベントのソースはサブスクライバーへの参照を保持する必要があることを理解しています。
- また、サブスクライバーがスコープ外になるか、明示的に破棄されてもイベント ソースが破棄されない場合、イベント ソースはサブスクライバーへの参照を保持しているため、サブスクライバーはガベージ コレクションされないことも理解しています。
- これを回避する一般的な方法は、オブジェクトが破棄される前に、ソースからサブスクライバーを明示的にサブスクライブ解除することです。プログラマーがこれがいつ発生するかを判断できない場合、これが問題になる可能性があることを理解しています。
上記から、イベントの使用がメモリリークを引き起こす可能性があることと、弱い参照パターンが必要な理由を理解していますが、理解を妨げているのは、弱いイベントパターンが実際にどのようにこの目標を達成するのですか? それは何が違うのですか?
確かに、イベントを管理するクラスがある場合でも、ハンドラーをソースにサブスクライブおよびサブスクライブ解除する必要があるため、参照が存在する必要があり、イベントを使用する標準的な方法で同じ問題が発生します。
誰かが私に欠けている、または誤解している基本的な概念を説明して、弱いイベントパターンを「理解」するのを手伝ってください。