8

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

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

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

在幕后究竟发生了什么?
从语法上肯定不是很明显。

4

3 回答 3

19

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

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

在这种情况下,'equals' 方法(对于委托())被覆盖,因此它只比较委托的目标和 methodPtr,即使您创建了一个新委托传递给 Remove ...

于 2009-08-27T15:47:52.990 回答
7

“新的 MyHandler”实际上是多余的。你可以简单地做

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

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

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

于 2009-08-27T15:50:47.743 回答
-1

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

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

于 2009-08-27T15:47:20.620 回答