C#事件删除语法

我对在C#中删除事件处理程序的语法感到困惑。

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

“new”在每一行上创建一个新对象,因此您添加一个对象,然后要求它删除另一个对象。

这可以起到什么作用?
从语法来看肯定不明显。

+ =和 – =是名为Add()和Remove()的内置内部方法的语法快捷方式,它们添加或删除指向委托作为私有字段的委托的内部链接列表的指针。 当您运行Remove时,它从链表的头部开始,一次检查列表中的每个委托,直到找到与您传递给Remove()方法的那个“相等”的委托。 (使用 – =语法)

然后,它从链表中删除那个,并修补链表以保持其连接性……

在此上下文中,重写’equals’方法(对于delegate()),以便它只比较委托的目标和methodPtr,即使您已创建要传递给Remove的新委托,它也将是相同的…

“新的MyHandler”实际上是多余的。 你可以干脆做

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

C#中的所有事件都是多播委托,因此+ =和 – =语法表示您正在向将要调用的委托列表添加/删除委托。

至于幕后发生的事情,我发现的最佳解释是Jon Skeet 。

您可以将事件视为在引发事件时执行的委托逻辑的占位符方法。 单个事件可以有多个订阅者(多播),因此+ =和 – =语法是单个事件处理程序的附加或删除方式。 简单地进行分配会重置事件的订阅,这可能会导致不必要的副作用。

编辑: 此链接解释了有关C#中的事件的更多信息