9

eventHandler で同じイベントを 3 回サブスクライブすると問題はありますか? 例えば

a.SomethingChanged += new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);

これにより、ChangeHandler が 1 回ではなく 3 回呼び出されますか? これを処理する最良の方法は何ですか?

これらの冗長性はまとめてではなく、コード パスの異なる領域であることに注意してください。

同様に、登録されていないイベントの登録解除に問題はありますか? 例えば

a.SomethingChanged -= new EventHandler(ChangeHandler);  //ChangeHandler was never registered
4

2 に答える 2

13

イベントを複数回サブスクライブすると、ハンドラーは対応する回数 (例では 3 回) 呼び出されます。

これが問題になるかどうかは、イベント ハンドラーの動作によって異なりますが、複数回呼び出されることは望ましくないと想定しています。

申し込んでいないイベントは退会しても問題ありません。

したがって、アプリケーションがどのような状態にあるのかわからない場合 (実際にはそうあるべきですが)、次のようにすることができます。

a.SomethingChanged -= ChangeHandler;
...
a.SomethingChanged += ChangeHandler;

(注:new EventHandler(...)はシンタックス シュガーであり、省略できます)

于 2013-01-22T20:04:10.493 に答える
5

eventHandler で同じイベントを 3 回サブスクライブすると問題はありますか?

いいえ、イベント ハンドラを 3 回追加するだけです。

これにより、ChangeHandler が 1 回ではなく 3 回呼び出されますか?

はい。

これを処理する最良の方法は何ですか?

それはあなたが望むものに依存します。あなたが指定していないもの。まだ追加されていない場合にのみイベント ハンドラーを追加する方法が必要な場合は、イベント ハンドラーを削除してから再度追加します。

a.SomethingChanged -= new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);

登録されていないイベントの登録解除に問題はありますか?

いいえ、何もしません。

于 2013-01-22T20:08:37.550 に答える