Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# event removal syntax

Tags:

c#

events

handler

I am confused by the syntax for removing event handlers in C#.

Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove

The "new" creates a new object on each line, so you add one object and then ask it to remove a different object.

What is really going on under the covers that this can work?
It sure isn't obvious from the syntax.

like image 731
Mark T Avatar asked Aug 27 '09 15:08

Mark T


2 Answers

The += and the -= are syntax shortcuts for built-in internal methods named Add(), and Remove(), which add or remove a pointer to an internal linked list of delegates that the delegate has as a private field. When you run Remove, it starts at the head of the linked list and examines each delegate in the list one at a time until it finds one that is "equal" to the one you passed to the Remove() method. ( using -= syntax)

Then, it removes that one from the linked list, and patches the linked list to retain it's connectivity...

In this context, the 'equals' method (for a delegate()) is overridden so that it only compares the target of the delegate, and the methodPtr, which will be the same even though you have created a new delegate to pass to Remove...

like image 89
Charles Bretana Avatar answered Sep 21 '22 07:09

Charles Bretana


The "new MyHandler" is actually redundant. You can simply do

Something += HandleSomething; // add
Something -= HandleSomething; // remove

All events in C# are multicast delegates, so the += and -= syntax indicates that you are adding/removing a delegate to the list of delegates that will be called.

As for what's going on behind the scenes, the best explanation that I've found is Jon Skeet's.

like image 41
womp Avatar answered Sep 24 '22 07:09

womp