委托类型和事件处理程序类型之间的区别是什么?

本文关键字:类型 区别 是什么 之间 程序 事件处理 | 更新日期: 2023-09-27 18:07:57

三个相关的习语:事件,委托,事件处理程序。我总是搞不懂谁是"加"给谁的。

event += handler
event += delegate
handler += delegate

From what I know:

  • delegate:一个指向已知签名函数的指针。
  • event-handler:一个注册到事件的委托。它和委托一样吗?
  • event:使用event()调用事件时执行的委托/事件处理程序列表

更让我困惑的是MSDN中的这个签名:

public delegate void EventHandler(Object sender, EventArgs e)

委托类型和事件处理程序类型之间的区别是什么?

一个"event"实际上只是两个与委托一起工作的方法的快捷方式——add和remove访问器。默认情况下,编译器会在事件背后创建一个委托(如果你不编写自己的访问器)。

当您调用someEvent += aDelegate;时,您调用的是事件的add访问器。通常,这被编译器转换为具有与事件相同签名的委托的delegate +=调用-类似于自动属性自动映射到支持字段的方式。这就是为什么事件看起来与委托如此相似。

更让我困惑的是MSDN中的签名:public delegate void eventandler (Object sender, EventArgs e)

这个签名只是一个委托签名。从技术上讲,事件可以使用任何委托。然而,按照惯例,它将始终接受两个参数-第一个是引发事件的"发送者",第二个是派生自EventArgs的类(如EventHandlerEventHandler<T>)。

事件添加了一个delegate,它"指向"一个处理程序。

所以基本上,当event被引发时,它所拥有的委托集合将被调用,结果将调用连接到这些委托的处理程序。

//declare delegate
public delegate void EventHandler(  Object sender,  EventArgs e)
//create event based on delegate
public event EventHandler evHandler;
//function to attach to handler
public static void Handler(object sender, EventArgs e) {}
attach eventhandler function through delegate to event.
event += new EventHandler(Handler);

这是我的总结(如果我错了请纠正我):

  • delegate是指向方法(instance'static)的指针

  • eventHandler是一个具有特定签名(sender, eventArgs)的委托

  • event是访问任何类型委托的抽象,但它通常是eventHandler约定

    //We declare delegates as a new type outside of any class scope (can be also inside?)
        public delegate retType TypeName (params...)
    //Here we assign
        public TypeName concreteDeleagteName = new TypeName (specificMethodName);
    //Declaring event
    //a. taken from http://stackoverflow.com/questions/2923952/explicit-event-add-remove-misunderstood
    private EventHandler _explicitEvent;
    public event EventHandler ExplicitEvent
    {
       add
       {
           if (_explicitEvent == null) timer.Start();
           _explicitEvent += value;
       }
       remove
       {
          _explicitEvent -= value;
          if (_explicitEvent == null) timer.Stop();
       }
    }
    //or: b.auto event - the compiler creates a "hidden" delegate which is bounded to this event
          public event TypeName eventName;
    

我想推荐一篇很棒的文章使用c#在。net中处理事件

所以我们只能附加(eventName):

eventName += new TypeName (specificMethodName);

相当于(_eventName是一个delegate'eventHandler):

_eventName += new TypeName (specificMethodName);