C#事件去除语法(C# event removal syntax)

2019-07-03 21:54发布

我对语法在C#中删除事件处理程序混淆。

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

“新”创建在每行一个新的对象,所以你添加一个对象,然后要求它删除不同的对象。

究竟怎么回事就在幕后,这可以工作吗?
这肯定不是从语法明显。

Answer 1:

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

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

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



Answer 2:

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

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

在C#中的所有事件都多路广播委托,所以+ =和 - =语法表示您要添加/删除委托代表的名单将被调用。

至于这是怎么回事幕后,我已经找到了最好的解释是乔恩斯基特的 。



Answer 3:

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

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



文章来源: C# event removal syntax