2010-12-07 35 views
2

在回答我的其他问题How to send custom event message just after control instantiation?我这样说的:我不明白事件委托的双重语法

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

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

uPDATE james的答案后:如果ValueChanged是一个对象,我怎么能称它为好像它是一个方法?它是一种语法糖或外来语法,带有一些神秘的机制,如调用ValueChanged.Invoke(sender,e); ?

回答

3

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

public event EventHandler ValueChanged = delegate {}; 

现在,您可以只需要调用的ValueChanged(发件人,E),因为可以的ValueChanged永远是空的。

+0

嘿谢谢爱这个想法从来没有null。 – user310291 2010-12-07 22:51:24

1

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

首先,你检查它是否为空,如果没有订户,情况就是这样。

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

1

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

1

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

2

像C#中的许多事情一样,语言特性旨在使事情更轻松。想想ValueChanged作为一个字段,你检查它为空(内部委托将检查用户)和

ValueChanged.Invoke(sender, e); 

第二速记版本的事件的实际签名是不是当然的领域更。它公开了用户的公共添加/删除属性以及用于调用的私有字段。