我对在C#中删除事件处理程序的语法感到困惑。
Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove
“new”在每一行上创建一个新对象,因此您添加一个对象 然后让它删除一个不同的对象。
这可以起到什么作用?# 从语法来看肯定不明显。
答案 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#中的事件的更多信息