C# 事件删除语法

标签 c# events handler

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

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

“new”在每一行创建一个新对象,所以你添加一个对象 然后要求它移除另一个对象。

这能奏效的幕后真相是什么?
从语法上看肯定不是很明显。

最佳答案

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

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

在此上下文中,'equals' 方法(对于 delegate())被覆盖,因此它只比较委托(delegate)的目标和 methodPtr,即使您创建了一个新的委托(delegate)传递给删除...

关于C# 事件删除语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1341895/

相关文章:

VBA - 分配给同一宏的多个复选框,如何确定哪个复选框触发事件?

javascript - 在文本框中粘贴某些文本时是否检查数字(没有设置超时)

swift - fatal error : 'try!' expression unexpectedly raised an error: CryptoSwift. AES.Error.BlockSizeExceeded:

java - 处理程序真正将其消息发布到哪里?

c# - 在 NHibernate 中如何将 Replace 添加到 Restrictions.Eq?

c# - 反序列化由 SignalR 作为抽象类传递的对象

C# Json.Deserialize with Object with Child class with interfaces

javascript - ActionScript3 中的奇怪事件监听

android - 停止 handler.postDelayed()

javascript - 根级别的数据在 $.ajax 调用中无效