質問

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

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

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

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

思い出すと、このループのデフォルトの実装ではリンクリストを使用し、リストを単純に反復処理して、EventHandlerデリゲートを順番に呼び出します。

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

  1. 誰かが私が読んでいた本を知っていますか?
  2. デフォルトの実装をオーバーライドする理由(本で回答されている可能性があります)

編集:私が言及している本は、実際にはC#経由のJeffrey RichterのCLRでした

役に立ちましたか?

解決

それは、多くの本やウェブ記事の1つであった可能性があります。

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

  • 多数のイベントがあり、その多くがサブスクライブされていない可能性がある場合、 EventHandlerList を使用してメモリ使用量を削減
  • サブスクリプション/サブスクリプション解除をログに記録することができます
  • 弱い参照を使用して、サブスクライバーの存続期間が自分のものに結び付かないようにすることができます
  • サブスクリプション/サブスクリプション解除に関連付けられたロックを変更することができます

他にもあると確信しています-それらは私の頭上にあります:)

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

他のヒント

ジェフリー・リヒターのC#経由のCLRで似たようなことを覚えているようです。 編集:彼がそれについて詳しく説明していることは間違いなく覚えています。

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

  1. いいえ
  2. たとえば、ハンドラーの1つの結果に基づいて呼び出しチェーンを解除する必要がある場合があります。 CustomEventArgsオブジェクトにプロパティ「Blocked」があり、trueに設定すると、それ以降のイベントハンドラー呼び出しがすべて抑制されるとします。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top