0

几年前,我读了一本书,描述了如何使用自己的处理器覆盖 .NET 中的默认事件“调度程序”实现。

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

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

每当事件触发时,都会调用 myBar1 和 myBar2 处理程序。

我记得,这个循环的默认实现使用一个链表并简单地遍历该列表并按顺序调用 EventHandler 委托。

我的问题有两个:

  1. 有人知道我在读哪本书吗?
  2. 为什么要覆盖默认实现(可能会在书中回答)?

编辑:我指的这本书确实是 Jeffrey Richter 通过 C# 编写的 CLR

4

3 回答 3

8

它可能是许多书籍或网络文章之一。

您可能希望更改订阅/取消订阅事件的方式有多种原因:

  • 如果您有很多事件,其中很多可能没有被订阅,您可能希望使用EventHandlerList来降低内存使用量
  • 您可能希望记录订阅/取消订阅
  • 您可能希望使用弱引用来避免订阅者的生命周期与您的生命周期相关联
  • 您可能希望更改与订阅/取消订阅关联的锁定

我敢肯定还有更多 - 这些都在我的脑海中 :)

编辑:另请注意,具有处理订阅/取消订阅的自定义方式与具有引发事件的自定义方式之间存在差异(例如,它可能调用 GetInvocationList 并保证调用所有处理程序,而不考虑异常)。

于 2008-10-02T14:52:18.957 回答
2

我似乎记得 Jeffrey Richter 通过 C# 编写的 CLR 中的类似内容。 编辑:我确实记得他对此进行了详细介绍。

控制事件注册有几个不同的原因。其中之一是在您有大量事件时减少代码膨胀。我认为杰弗里在书中详细介绍了这一点......

于 2008-10-02T14:51:36.557 回答
1
  1. 例如,您可能需要根据其中一个处理程序的结果来中断调用链。假设您的 CustomEventArgs 对象有一个属性“Blocked”,当设置为 true 时会抑制所有进一步的事件处理程序调用。
于 2008-10-02T14:52:11.657 回答