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



我试图揭穿.NET事件和代表在使用事件和代表(相信这是一个调用列表?(时,在描述事件订阅对象时会互换的数量(相信这是一个调用列表?(。

在此示例代码的情况下,我听过的一些人说,正在将处理程序函数添加到活动的调用列表中,而其他人则说它正在添加到委托中(我最初认为这是(仅(调用列表。(

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

delegate void MyEventHandler (int x, string y);
class myClass {
    public event MyEventHandler MyEvent;
}
myClass obj = new myClass();
obj.MyEvent += handlerFunction;

定义事件以代表为类型创建变量。它是指代表的实例。因此,您可以说该事件具有调用列表,或者代表的实例具有调用列表,因为event = of demegate。

实例。

这就是为什么您要声明event,如您所拥有的:

public event MyEventHandler MyEvent;

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

委托是不可变的,不可变的。因此,从技术上讲,当您将一个额外的处理程序订阅到事件中时,您不是 在现有代表实例的调用列表中添加处理程序时,您正在创建一个新的代表,其调用列表将包含旧代表的所有内容调用列表加上您的新处理程序,并将新代表分配给该活动的支持商店。

所有的话,我希望您正在阅读的内容只是在捷径有所捷径,在这里没有过度具体的细节,因为这与我期望他们目前实际上要讨论的内容并不重要。

至于将其视为"委托"与"调用列表"之间的区别。每个委托只是一个调用列表。任何代表没有什么。在这里提及任何一个确实没有什么特别的错误。从技术上讲,该事件有一个代表,并且订阅活动处理程序正在创建一个新的代表,该代表在内部与旧代表的调用列表略有不同,并且将新的代表分配给了备用商店。捷径是说添加处理程序正在向调用列表中添加一种新方法是...至少在那里遍历重要点。在代表实例中保留了调用列表,对于理解如何订阅处理程序并不是特别关键。

最新更新