そのイベントが参照を保持する唯一のものであり、オブジェクトをガベージコレクションする必要がある場合は、WeakReferenceを介してイベント処理を実装することをお勧めしますか?
これに対する議論として:
購読を解除するのはあなたの責任であり、それを行うべきだと人々は言います。
そのイベントが参照を保持する唯一のものであり、オブジェクトをガベージコレクションする必要がある場合は、WeakReferenceを介してイベント処理を実装することをお勧めしますか?
これに対する議論として:
購読を解除するのはあなたの責任であり、それを行うべきだと人々は言います。
可能であれば、イベントのサブスクライブを解除する習慣を身につけるのは良いことですが、それを実行できる明らかな「クリーンアップ」方法がない場合もあります。最近、このテーマに関するブログ記事を投稿しました。WeakReference を使用してイベントを簡単にサブスクライブできるメソッドが含まれています。
弱いデリゲートパターンは、CLRに存在する必要があるものです。通常のイベントは「あなたが生きている間に私に通知する」というセマンティクスを示しますが、多くの場合、「私が生きている間に私に通知する」必要があります。デリゲートがオブジェクトであり、受信者がまだ生きていて着信参照がある場合でも、デリゲート自体は前述のWeakReferenceによってのみ参照され、即座に収集されるため、WeakReferenceにデリゲートがあるだけでは間違っています。実装例については、この古い投稿を参照してください。
デリゲートが参照を保持しているため、それ自体が弱い参照です。問題は解決しません。Prism に同梱されている Composite Application Library (www.microsoft.com/compositewpf) には、ソースから取得できる WeakDelegate クラスがあります。WeakDelegate は基本的にリフレクションを使用し、デリゲートを一時的に作成してから解放するため、ポインターを保持しません。CAL 内では EventAggregator クラスによって使用されますが、MS-PL の下にあるため、自分で使用するために自由に切り取ることができます。
あなたが提案したことは一連の問題 (イベント参照管理とメモリ リークの防止) を解決しますが、新しい問題のセットを開く可能性があります。
私が見ることができる 1 つの問題は、ソース オブジェクトがガベージ コレクションされている場合 (弱参照でのみ保持されていたため)、イベント処理プロセス中に発生し、ソース オブジェクトにアクセスするコードは null 参照例外になります。イベント ハンドラーがソース オブジェクトにアクセスしてはならないか、強い参照が必要であると主張することはできますが、これは、最初に解決しようとしている問題よりも悪い問題である可能性があると主張することができます。