0
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 事件。引发事件的概念完全等同于调用由事件表示的委托——因此,引发事件没有特殊的语言结构。请注意,委托调用之前有一个检查,以确保委托为非空。

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

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

4

2 回答 2

0

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

从引发它的代码的角度来看,这就是事件的样子。该事件是使用标准方法调用语法(与某些“特殊”语法相反)引发的,它依次以无特定顺序调用所有订阅的事件处理程序。

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

如果没有订阅事件的事件处理程序,则“代表事件的委托”为空。因此,要引发事件,您应该执行以下操作:

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) 被认为是一种好习惯。

于 2013-04-10T02:56:20.500 回答
0

这是深入的,可能不是您正在寻找的。但是,它非常详细地分解了事件和代表之间的差异……一直到 IL。

否则:这个 SO 已经在更简单的基础上得到了回答

于 2013-04-10T02:37:15.480 回答