0

ローカル変数に割り当てられたイベントリスナーを削除することを心配する必要がありますか?

次のサンプルについて考えてみます。

var zipUtil = new ZipUtil();
zipUtil.ProgressChanged += ZipUtil_ProgressChanged;

ZipUtilメソッド内にローカル変数として格納されるクラスのインスタンスを作成しています。メソッドが終了する前にリスナー(zipUtil.ProgressChanged -= ZipUtil_ProgressChanged;)を削除する必要がありますか、それともステップをスキップしても大丈夫ですか?

4

2 に答える 2

5

いいえ、そのイベント処理メソッドを削除する必要はありません。

イベントハンドラーをイベントに追加すると、(を含む)イベントからイベントハンドラーへの参照が作成されますが、その逆ではありません。zipUtilスコープから外れると、イベントハンドラーはへの参照に関して何の違いも生じませんzipUtil

于 2012-09-03T18:46:46.803 に答える
2

2行のコードでは、正確に呼び出しを行うのに十分ではありません。ただし、明示的に登録を解除する必要はほとんどありません。考えられる問題のシナリオは2つあります。

  • たとえば、オブジェクトが破棄された後、クラスは不適切なタイミングでイベントを発生させる可能性があります。このシナリオでは、これはほとんどあり得ません。メソッドの呼び出しを停止すると、ZipUtilクラスはProgressChangedイベントの発生を停止します。完全に問題外ではありませんが、たとえばバックグラウンドスレッドで機能する可能性があります。スニペットからは見えません。

  • イベントが原因でガベージコレクションの問題が発生する可能性があります。イベントデリゲートは、ZipUtil_ProgressChanged()メソッドを呼び出すことができるようにするために必要な、クラスオブジェクトへの暗黙の参照を保持します。インスタンスメソッドの場合は、スニペットから明確にしないでください。その参照は、外部クラスを存続させます。しかし、その逆ではありません。ZipUtilオブジェクトの存続期間がメソッドに制限されており、外部クラスが少なくともメソッドの最後まで存続することを確実に望んでいることを考えると、これが問題になることはありません。

ZipUtilがIDisposablebtwを実装する可能性が高いです。使用する場合は、必ずusingステートメントを使用してください。

于 2012-09-03T18:55:18.200 に答える