委托类型和事件处理程序类型有什么区别?

三个相关的习语:事件,委托,事件处理程序。 我总是对谁被“添加”给谁感到困惑。

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

据我所知:

  • delegate:指向具有已知签名的函数的指针。
  • event-handler:注册到事件的委托。 基本上,它是否与代表相同?
  • event:使用event()调用事件时执行的委托\事件处理程序列表

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

 public delegate void EventHandler(Object sender, EventArgs e) 

“事件”实际上只是两个使用委托的方法的快捷方式 – 添加和删​​除访问器 。 默认情况下,编译器会在事件后面创建一个委托(如果您不编写自己的访问器)。

当你调用someEvent += aDelegate; ,你正在调用事件的add访问者。 通常,编译器将其转换为delegate +=调用具有与事件相同签名的委托 – 类似于自动属性自动映射到支持字段的方式。 这就是为什么一个事件看起来与代表非常相似的原因。

令我困惑的是MSDN中的这个签名:public delegate void EventHandler(Object sender,EventArgs e)

此签名只是委托签名。 从技术上讲,事件可以使用任何代表。 但是,按照惯例,它总是需要两个参数 – 第一个是引发事件的“sender”,第二个是从EventArgs派生的类(如EventHandlerEventHandler )。

该事件添加了一个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是委托\ eventHandler):

 _eventName += new TypeName (specificMethodName);