澄清事件调用

时间:2013-04-10 02:10:57

标签: c# events delegates

public delegate void EventHandler(object sender, EventArgs e);
public class Button: Control
{
   public event EventHandler Click;
   protected void OnClick(EventArgs e) {
      if (Click != null) Click(this, e);
   }

}

本书通过以下方式解释了上述代码:

  

Button类中的OnClick方法“引发”Click事件。提出事件的概念恰恰等同于引用事件   由事件代表的代表 - 因此,没有特别的   用于举起活动的语言结构。请注意代表   调用之前是一个确保委托是的检查   非空。

为什么在每个事件处理程序都有一个委托实例时,事件中只有一个委托?实例是一个实例,事件可以包含许多连接到实际方法的委托实例。

如果有人能为我理解这一段,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

This is in depth可能并不完全符合您的要求。但是,它以非常好的细节打破了事件和代表之间的差异......一直到IL。

否则:this SO has already been answered on a simpler basis

答案 1 :(得分:0)

  

现在“事件所代表的代表”是什么意思?

这是事件从提升它的代码的角度看起来像的方式。事件是使用标准方法调用语法(而不是某些“特殊”语法)引发的,而后者又调用所有已订阅的事件处理程序in no particular order

  

“确保委托是非空的检查”是什么意思?

如果没有事件处理程序订阅该事件,则“表示事件的委托”为空。所以为了举起这个活动,你应该这样做:

class MyClass {

    public delegate void MyEventHandler(MyEventArg arg);

    public event MyEventHandler MyEvent;

    void RaiseMyEvent(MyEventArg arg) {
        var handler = MyEvent;
        if (handler != null) // Any subscribers?
            handler(arg);
    }

}

顺便说一句,将事件复制到局部变量(handler)被认为是this reason的一个好习惯。