C#事件删除语法

时间:2009-08-27 15:38:26

标签: c# events handler

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

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

“new”在每一行上创建一个新对象,因此您添加一个对象 然后让它删除一个不同的对象。

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

3 个答案:

答案 0 :(得分:19)

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

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

在此上下文中,重写'equals'方法(对于delegate()),以便它只比较委托的目标和methodPtr,即使你已经创建了一个新的委托,它也是相同的传递给删除...

答案 1 :(得分:7)

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

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

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

关于幕后发生的事情,我发现的最佳解释是Jon Skeet's

答案 2 :(得分:-1)

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

编辑:this link解释了有关C#中的事件的更多信息