我由语法混淆在C#去除的事件处理程序。

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

“新”创建在每一行上的新对象,所以添加一个对象 然后问它,以除去一个不同的对象。

什么是真的在幕后,这可以工作吗?点击 可以肯定的是不明显从语法。

有帮助吗?

解决方案

在+ =和 - =是内置内部方法名称为Add()语法的快捷方式,并删除(),其添加或删除一个指针代表的内部链表该委托具有作为私有字段。当您运行删除,它开始在链表的头,在同一时间检查列表中的每一个代表,直到它找到一个“等于”给你传递给remove()方法之一。 (使用 - =语法)

然后,它会删除一个从链表和补丁链表保留它的连接...

在这种情况下,“等于”方法(委托())被覆盖,使得其只比较委托的目标,并且methodPtr,这将是,即使你已创建了一个新的委托,以相同的传递给删除...

其他提示

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

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

在C#的所有事件是多路广播委托,所以+ =和 - =语法指示要添加/移除一个委托给委托列表将被称为

至于发生了什么事情在幕后,我已经找到了最好的解释是乔恩斯基特的

可以认为事件占位符方法,当引发事件执行委托逻辑。单个事件可以有多个用户(多重投放),所以+ =和 - =语法是单个的事件处理程序是如何附接或移除。简单地做一个任务将重置事件的订阅,这可能会导致不必要的副作用。

编辑:此链接详细解释了在C#

事件触发
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top