我是新学习的事件'和'代表'在C#中。 现在我有一个问题,我在其他任何地方找不到答案。
众所周知,每个事件都是基于特定的代表创建的。起初我认为事件就像委托实例,但后来我发现它们不是。
我的问题是,事件与其基础代理之间的关系是什么?该事件是否创建了委托的实例并分配了事件处理程序'在运行时的方法?或者指定的代表只是分配事件处理程序'
的约定答案 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
事件是一种特殊的多播委托,只能从声明它的类中调用。客户端代码通过提供对触发事件时应调用的方法的引用来订阅事件。这些方法通过事件访问器添加到委托的调用列表中。