C# 与#x2018之间的差异+;=新事件处理程序&x2019;和‘;-=新事件处理程序(anEvent)和#x2019;

C# 与#x2018之间的差异+;=新事件处理程序&x2019;和‘;-=新事件处理程序(anEvent)和#x2019;,c#,C#,我看到一些代码使用了-=neweventhandler(anEvent),你能告诉我'+=neweventhandler'有什么不同吗 谢谢一个将委托添加到订阅者集合,另一个将其删除 例如,如果您以前订阅过一个事件,但您希望在关闭表单时删除引用,那么您将使用-=版本,并且不再收到通知。操作符从事件中删除偶数处理程序,而+=将事件处理程序添加到事件中 例如: if (checkSomething()) { //handle clicks on myControl myControl.Click +

我看到一些代码使用了-=neweventhandler(anEvent),你能告诉我'+=neweventhandler'有什么不同吗


谢谢

一个将委托添加到订阅者集合,另一个将其删除


例如,如果您以前订阅过一个事件,但您希望在关闭表单时删除引用,那么您将使用
-=
版本,并且不再收到通知。

操作符从事件中删除偶数处理程序,而
+=
将事件处理程序添加到事件中

例如:

if (checkSomething())
{
//handle clicks on myControl
myControl.Click += MyEventHanderMethod;
}
else
{
//stop handling clicks on myControl
myControl.Click -= MyEventHanderMethod;
}

我想人们永远不应该使用-=newEventHandler(anEvent),因为新的事件处理程序还不能出现在事件委托列表中。我们应该:

EventHandler eventHandler = new EventHandler(anEvent);
anObject.Event += eventHandler;
...
anObject.Event -= eventHandler;
已更新


实际上Ed是对的,委托将检查目标和方法,而不是处理程序对象。对我来说,了解这一点有点晚了,这使得我写的很多行都过时了…

这两个操作符只是内部框架方法System.MultiCastDelegate.Combine()和System.MultiCastDelegate.Remove()的语法快捷方式。每个委托都来自System.MultiCastDelegate,它包含委托的内部私有链接列表。IL编译器(Combine and Remove)将+=和-=转换为的新方法有效地将(或分别删除)委托参数中的内部委托(在+=或-+的右侧)添加到左侧委托的内部链接列表中,

这并没有解决这个问题……不过我会注意到,您的思维方式比实际行为更符合逻辑。为什么在实际代码中会出现“-=new”?史蒂文:那完全错了。这正是我们在答复中所说的。关于这样做的理由;以避免内存泄漏。EventHandler是对对象的引用。如果订阅的事件是外部的,这意味着仍然存在一个延迟引用,即GC无法收集它。还有许多其他原因。您显然不了解该语言的某些方面。@Steven(大多数情况下)必须删除处理程序。阅读我只是不知道委托列表中的包装器委托比较规则,Ed是对的。