決定論的にサブスクライブを解除できない場合は、弱いイベントを使用しています (それ以外の場合は、弱いイベントの代わりに優先+=
します)。-=
class SomeType
{
public SomeType(...)
{
// object doesn't know when it will be removed
WeakEventManager(SomeSource, EventArgs).AddHandler(someSourceInstance,
nameof(SomeSource.SomeEvent), (s, e) => { ... });
}
}
このように、オブジェクトがガベージ コレクションされた場合、イベント ハンドラーは呼び出されません。完全。
でも。オブジェクトがまだガベージ コレクションされていない場合 (ただし、強い参照がなくなった場合)、イベント ハンドラーは引き続き呼び出されます。
私の質問はかなり一般的です:弱いイベントを使用するときはどうすればよいですか? 弱いイベントを使用する場合、イベント ハンドラーで無効な呼び出しを予期する必要がありますか? または、 GCにそのケースを回避するように強制する必要があります(決定論的な「クリーンアップ」のようなもの)? 他の何か?