web-dev-qa-db-ja.com

WeakReferenceとイベント処理

そのイベントが参照を保持する唯一のものであり、オブジェクトをガベージコレクションする必要がある場合は、WeakReferenceを介してイベント処理を実装することをお勧めしますか?

これに対する議論として:

購読している場合は購読を解除するのはあなたの責任であり、そうすべきだと人々は言います。

31
Cherian

可能な場合はイベントの購読を解除する習慣を身に付けるのは良いことですが、それを実行できる明確な「クリーンアップ」方法がない場合もあります。最近、このテーマについて ブログ記事 を投稿しました。これには、WeakReferenceを使用してイベントを簡単にサブスクライブできるようにするメソッドが含まれています。

14
Ed Ball

弱いデリゲートパターンは、CLRに存在する必要があるものです。通常のイベントは「あなたが生きている間に私に通知する」というセマンティクスを示しますが、多くの場合、「私が生きている間に私に通知する」必要があります。デリゲートもオブジェクトであり、受信者がまだ生きていて着信参照がある場合でも、デリゲート自体は前述のWeakReferenceによってのみ参照され、即座に収集されるため、WeakReferenceにデリゲートがあるだけでは間違っています。実装例については、 この古い投稿 を参照してください。

9
Ilya Ryzhenkov

弱い参照自体は、デリゲートが参照を保持しているため、問題を解決しないでください。 Prismに同梱されているCompositeApplication Library(www.Microsoft.com/compositewpf)には、ソースからプルできるWeakDelegateクラスがあります。 WeakDelegateは基本的にリフレクションを使用し、デリゲートを一時的に作成してから解放するため、ポインターを保持しません。 CAL内では、EventAggregatorクラスによって使用されますが、MS-PLの下にあるため、自由に使用できます。

6
Glenn Block