Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between a delegate type and eventhandler type?

Three related idioms: event, delegate, event-handler. I always get confused by who is "added" to who.

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

From what I know:

  • delegate: a pointer to a function with a known signature.
  • event-handler: a delegate which is registered to an event. Basically, is it the same as a delegate?
  • event: a list of delegates\event-handlers which are executed when the event is invoked using event()

What confuses me more is this signature in MSDN:

public delegate void EventHandler(Object sender, EventArgs e)
like image 601
Elad Benda Avatar asked Sep 07 '11 14:09

Elad Benda


2 Answers

An "event" is really just shortcut for two methods that work with a delegate - the add and remove accessors. The compiler, by default, makes a delegate behind the event (if you don't write your own accessors).

When you call someEvent += aDelegate;, you're calling the event's add accessor. Normally, this is translated by the compiler into a delegate += call for a delegate with the same signature as the event - similar to how automatic properties automatically map to a backing field. This is why an event seems so similar to a delegate.

what confuses me more is this signature in MSDN: public delegate void EventHandler( Object sender, EventArgs e)

This signature is just a delegate signature. An event can, technically, use any delegate. However, by convention, it will always take two parameters - the first is the "sender" that raised the event, the second is a class that derives from EventArgs (like EventHandler and EventHandler<T>).

like image 146
Reed Copsey Avatar answered Oct 22 '22 04:10

Reed Copsey


The event has a delegate added to it which "points" to a handler.

So basically, when the event is raised, the collection of delegates it has, will be invoked, which as result will invoke handlers connected to those delegates.

//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);
like image 38
Tony The Lion Avatar answered Oct 22 '22 03:10

Tony The Lion