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.
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...
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With