ラムダ式を使用するイベントのサブスクリプションを解除するにはどうすればよいですか?
-
03-07-2019 - |
質問
コレクションの変更にGUIを応答させるために、次のコードがあります。
myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());
まず、これはこれを行うのに良い方法ですか?
2番目:このイベントから退会するコードは何ですか?同じですが、-=を使用します(その後、完全な匿名メソッドを再度使用します)。
解決
イベントの購読を解除する必要がある場合は、インスタンス化された参照が必要です。残念ながら、それはその特定の構文を使用できないことを意味します。
他のヒント
まず第一に...はい、それはそれを行う良い方法です、それはきれいで、小さく、読みやすいです&理解してください...もちろん、警告は「後で登録を解除したくない場合」です。
その前に Jon Skeet が指摘したと思う "仕様は、匿名メソッドで作成されたデリゲートの等価性に関して、どちらの方法でも明示的に動作を保証しません。
したがって、後でイベントの購読を解除する必要がある場合は、後で参照のためにハングアップできるように、実際にデリゲートインスタンスを作成するのが最善です。
var myDelegate = delegate(sender, e){UpdateMyUI()};
myObservableCollection.CollectionChanged += myDelegate;
myObservableCollection.CollectionChanged -= myDelegate;
myObservableCollectionが「this」より長く生存しない限り、これは大丈夫な方法です。この場合、メモリリークが発生する可能性があります。これ '、それはそれを生かし続けます。イベントをリッスンしているものを繰り返し作成および「破壊」している場合、ガベージコレクターによって収集されていないことがわかります。
これが問題である場合は、回答で提案されたルートに進み、ハンドラーへの参照を保存します。最初に作成する必要があります。
別の解決策は、弱い参照を使用してイベントハンドラを作成し、他に参照がない場合にサブスクライバを収集できるようにすることです。 この質問と回答。