我不明白事件委托的双重语法

时间:2010-12-07 22:23:23

标签: c#

在回答我的另一个问题How to send custom event message just after control instantiation?时,我读到了这个问题:

if (ValueChanged != null)
{
   ValueChanged(sender, e);
}

第一种情况下ValueChanged是什么?不是第二条指令中的功能?如何将相同的符号用于......和函数?

在james的回答之后的

uPDATE:如果ValueChanged是一个Object,我怎么能把它称为一个方法呢?它是一种语法糖或外来语法,后面有一些神秘的机制,比如调用ValueChanged.Invoke(sender,e); ?

5 个答案:

答案 0 :(得分:3)

ValueChanged是一个多播委托,它是一个对象。如果没有人订阅该事件,它可以为null,因此检查。如果要避免检查,可以定义一个空委托并将其分配给事件。

public event EventHandler ValueChanged = delegate {};

您现在可以调用ValueChanged(sender,e),因为ValueChanged永远不能为null。

答案 1 :(得分:2)

与C#中的许多内容一样,语言功能旨在简化操作。将ValueChanged视为一个字段,并检查它是否为空(委托内部将检查订阅者),第二个是速记版本

ValueChanged.Invoke(sender, e);

事件的实际签名当然不仅仅是一个领域。它为订阅者公开了一个公共的添加/删除属性,以及一个用于调用的私有字段。

答案 2 :(得分:1)

在两种情况下,ValueChanged都是相同的。

首先,检查它是否为空,如果没有订阅者就是这种情况。

其次,使用类似方法的语法执行委托。

答案 3 :(得分:1)

事件只是代表 - 对其他地方的函数的引用。当调用上面的事件时,我们正在调用委托。由于委托只是对函数的引用,我们需要处理以前可能没有设置的情况(I.E. null)

答案 4 :(得分:1)

ValueChanged是一个或多个函数的引用。如果没有引用,则该值将为null。如果该值不为null,则所有引用的函数将由ValueChanged(sender, e);语法调用。