オブジェクト内のイベントにアタッチすることの意味が完全にわかっているかどうかはわかりません。どのような場合にイベントから切り離す必要がありますか?
これは正しい、私の現在の理解であるか詳しく説明:
this.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
public event EventHandler OnMyCustomEvent = delegate { };
1.
例をデタッチする必要はありません。
私はあなたのobまたは削除された場合、関数は割り当てが解除され、自動的にイベントから切り離されます。 はあなただけに一度に応答タイマーのElapsedイベントにアタッチ:;あなた不要になった(=ヌル)オブジェクトへの接続
2.
例から取り外すことがあります。イベントが発生した後にElapsedイベントをデタッチできるように、ローカル変数にTimerを格納する必要があると仮定します。したがって、その漏れにつながるようにローカルメソッドのスコープでタイマーを宣言:
System.Timers.Timer myDataTimer = new System.Timers.Timer(1000); myDataTimer.Elapsed += new System.Timers.ElapsedEventHandler(myDataTimer_Elapsed);
3を配置する必要はありませんあなたのクラスにローカルオブジェクトでのイベントにアタッチ?
例えば、ObservableCollectionを作成し、監視し、終了させるObservableCollectionがあったとします。ローカルのプライベート関数を使用してCollectionChangedイベントにアタッチした場合、クラスがガベージコレクションされたときにこの関数の割り当てが解除され、ObservableCollectionも解放されますか?
私はオブジェクトの使用を中止した場所があり、イベントから切り離されていないと確信しています(たとえば、私が作ったタイマーの例)。これはどういう仕組みでより明確な説明を探しています。
あなたは正しいです、私は事を複雑にしています。例を探す際には、そのほとんどがイベントから切り離されていただけで、購読者がサイト運営者を存続させることができると私は信じました。 –
愚かな質問:それは、パブリッシャーがサブスクライバのイベントにサブスクライブすると、その2つのどちらも収集できないことを意味しますか? –
いいえ、循環参照があることを意味します。どちらにも*他の*根拠のない参照がなくなると、それらは両方ともGCの対象となります。 –