C#, Events and Delegates as an Elevator Pitch - Or in 3 seconds
Here are the elevator pitches you should know about events and delegates:
A Delegate is a (or collection of) strongly typed FunctionPointer(s)
An Event is a wrapped Delegate
But to be honest this is not big news and not the reason for this blog. I thought this would make a nice starter... Like when you go for a nice dinner. Today I had the chance to look under the hood and I was astonished to see what really happens. This made me think... hmm sounds like an interesting post for Friday afternoon. (Thank you Mark!)
So let's take a second to verify the second statement. An Event is a wrapped Delegate:
First we define an Event and subscribe to it:
//Test class with the event
public class TomsEventClass
{
public event EventHandler ItsTomTime;
}
//test program
class Program
{
static void Main(string[] args)
{
TomsEventClass tom = new TomsEventClass();
tom.ItsTomTime += tom_ItsTomTime;
}
static void tom_ItsTomTime(object sender, EventArgs e)
{
//let's see what we can do it
}
}
But what was actually generated by the compiler? Let's use Reflector to look at the IL
The Event gets translated into one private delegate:
.field private class [mscorlib]System.EventHandler ItsTomTime
... and into two public methods to add and remove Subscribers:
.event [mscorlib]System.EventHandler ItsTomTime
{
.addon instance void ConsoleApplication3.TomsEventClass::add_ItsTomTime(class [mscorlib]System.EventHandler)
.removeon instance void ConsoleApplication3.TomsEventClass::remove_ItsTomTime(class [mscorlib]System.EventHandler)
}
And when we subscribe we see we actually call the generated add_ItsTomTime method:
callvirt instance void ConsoleApplication3.TomsEventClass::add_ItsTomTime(class [mscorlib]System.EventHandler)
That's it!
I have to admit, even knowing that events where restriced delegates I never took the time to really look under the hood.
This won't make me a better programer but it is fun to know (at least for a Geek on geekswithblogs :-)
Tom