0

数年前、.NETのデフォルトのイベント「ディスパッチャー」の実装を独自のプロセッサーでオーバーライドする方法を説明した本を読みました。

    class foo {
       public event EventHandler myEvent;
       ...
    }

    ...
      myFoo.myEvent += myBar1.EventHandler;
      myFoo.myEvent += myBar2.EventHandler;

イベントが発生するたびに、myBar1ハンドラーとmyBar2ハンドラーの両方が呼び出されます。

私が思い出したように、このループのデフォルトの実装はリンクリストを使用し、リストを繰り返し処理して、EventHandlerデリゲートを順番に呼び出します。

私の質問は2つあります:

  1. 誰かが私が読んでいた本を知っていますか?
  2. なぜデフォルトの実装(本で答えられるかもしれない)をオーバーライドしたいのですか?

編集:私が参照していた本は確かにC#経由のジェフリー・リッチターのCLRでした

4

3 に答える 3

8

多くの書籍や Web 記事の 1 つだった可能性があります。

イベントのサブスクライブ/サブスクライブ解除方法を変更する理由はさまざまです。

  • 多くのイベントがあり、その多くがサブスクライブされていない可能性がある場合は、EventHandlerListを使用してメモリ使用量を減らすことができます。
  • 購読/購読解除を記録したい場合があります
  • サブスクライバーのライフタイムが自分のライフタイムに結び付けられるのを避けるために、弱参照を使用することをお勧めします。
  • サブスクリプション/サブスクリプション解除に関連するロックを変更したい場合があります

もっとあると思います-それらは私の頭の上から外れています:)

編集:また、サブスクリプション/サブスクリプション解除を処理するカスタムの方法と、イベントを発生させるカスタムの方法との間には違いがあることに注意してください (たとえば、GetInvocationList を呼び出して、例外に関係なくすべてのハンドラーが呼び出されることを保証する場合があります)。

于 2008-10-02T14:52:18.957 に答える
2

Jeffrey Richter の CLR via C# で似たようなことを覚えているようです。 編集:彼がそれについて詳しく説明したことを私は間違いなく覚えています.

イベント登録を制御する理由はいくつかあります。それらの 1 つは、大量のイベントがある場合にコードの肥大化を減らすことです。ジェフリーは本の中でこれについて詳しく説明したと思います...

于 2008-10-02T14:51:36.557 に答える
1
  1. いいえ
  2. たとえば、ハンドラーの 1 つの結果に基づいて呼び出しチェーンを中断する必要がある場合があります。CustomEventArgs オブジェクトに「Blocked」プロパティがあるとします。これを true に設定すると、それ以降のすべてのイベント ハンドラの呼び出しが抑制されます。
于 2008-10-02T14:52:11.657 に答える