事件是否创建了已分配代理的实例,或者它只是一个约定?

时间:2018-03-10 15:37:21

标签: c# .net events delegates

我是新学习的事件'和'代表'在C#中。 现在我有一个问题,我在其他任何地方找不到答案。

众所周知,每个事件都是基于特定的代表创建的。起初我认为事件就像委托实例,但后来我发现它们不是。

我的问题是,事件与其基础代理之间的关系是什么?该事件是否创建了委托的实例并分配了事件处理程序'在运行时的方法?或者指定的代表只是分配事件处理程序'

的约定

3 个答案:

答案 0 :(得分:1)

事件基本上是要调用的方法列表。因此,代表只是一种强烈的类型"方法参考。这就是为什么对事件有两种可能的操作:添加处理程序+=并删除处理程序:-=。这应该可以防止意外.Clear()之类的错误,这些错误会暂时取消订阅所有现有的听众。

如果您需要更多&#34;明显&#34;它是如何工作的示例,而不是List<Delegate>是一个事件,其中Delegate表示对某个签名的任何函数的引用。每当你需要&#34;调用&#34;事件,您遍历现有的委托列表,并使用相同的参数调用每个委托。

答案 1 :(得分:0)

委托的事件与备用字段的自动属性相同。由于auto-property只是一个支持字段的包装器,因此事件只是(支持)委托的包装器。它提供了add - 和remove - 方法来追加或删除事件处理程序。因此,您有一个私有的处理程序列表,事件只是一个将此列表公开给外部的包装器。

您可以按如下方式定义事件:

private EventHandler _explicitEvent;
public event EventHandler ExplicitEvent 
{
    add { _explicitEvent += value; } 
    remove { _explicitEvent -= value; }
}

所以你有一个私人支持字段,它是一个委托。您肯定可以将多个处理程序分配给同一个委托,从而分配给事件。事实上,当你有一个事件:

public event EventHandler MyEvent;

编译器将隐含地为您创建私有后备委托,就像它对自动属性一样。

对于属性,您可以在add - 和-remove - 访问器中添加一些其他逻辑,以便修改在指定处理程序时发生的情况。例如,您可以进行一些验证或调用一些日志记录。

答案 2 :(得分:0)

根据 Microsoft Docs =&gt; Here

  

事件是一种特殊的多播委托,只能从声明它的类中调用。客户端代码通过提供对触发事件时应调用的方法的引用来订阅事件。这些方法通过事件访问器添加到委托的调用列表中。