订阅事件是否将处理函数添加到事件或事件委托的调用列表中?

时间:2018-02-21 16:39:40

标签: c# .net events delegates

我试图在描述订阅该事件的对象时,在.NET事件和委托上有多少教程使用Event和Delegate(相信这是一个调用列表?)可以互换。

在这个示例代码的情况下,我听过一些人已经说过handlerFunction被添加到Event的调用列表中,而其他人则说它被添加到了委托(这是我原来认为的是(仅)调用列表。)

订阅者实际订阅的位置细分是什么?

delegate void MyEventHandler (int x, string y);

class myClass {
    public event MyEventHandler MyEvent;
}

myClass obj = new myClass();
obj.MyEvent += handlerFunction;

2 个答案:

答案 0 :(得分:1)

代表是不可变的,不可变的。因此,从技术上讲,当您为一个事件订阅一个额外的处理程序时,您不会将处理程序添加到现有的委托实例的调用列表中,而是创建一个调用它的新委托。 list将包含旧委托的调用列表中的所有内容以及新处理程序,并将该新委托分配给该事件的后备存储。

所有这一切,我希望您正在阅读的内容只是略微缩短,而不是在这里进行过于具体的细节,因为它并不是一个与我期望的相关的重点。实际上是在试图讨论。

至于将其视为"代表"与#,#34;一个调用列表"。每个代理 只是一个调用列表。任何代表都没有更多的东西。在这里引用任何东西都没有什么特别的错误。从技术上讲,事件具有委托,订阅事件处理程序正在创建一个新委托,其内部调用列表与旧委托略有不同,并且新委托被分配给后备存储。简单地说添加处理程序是在调用列表中添加一个新方法是......至少要跨越那里的重点。调用列表保存在委托实例中对于理解如何为事件订阅处理程序并不是特别重要。

答案 1 :(得分:1)

定义事件会创建一个变量,并将委托作为类型。它指的是委托的一个实例。所以你可以说事件有一个调用列表或者委托的实例有一个调用列表,因为event = delegate的实例。

这就是为什么如果你声明一个event

public event MyEventHandler MyEvent;

MyEventDelegate,您可以调用其GetInvocationList()方法。 GetInvocationList()Delegate的成员。