在C#中它是什么意思:按事件使用-=运算符?

在C#中它是什么意思:按事件使用-=运算符?,c#,events,operators,C#,Events,Operators,什么时候必须按事件使用此运算符?它的用途是什么?删除Eventhandler函数。 正如+=向您订阅事件的处理程序一样,-=取消订阅 当您不再希望在引发事件时调用特定处理程序时,请使用它。您通常只需要使用它,因为引发事件的组件在逻辑上比事件处理程序的寿命更长—如果您不取消订阅,“事件引发程序”实际上有一个对处理程序的引用,因此可以使其比您想要的时间更长 如评论所述: -=将只删除一个处理程序;如果订阅了多个处理程序(即使使用完全相同的委托),它仍然只会将处理程序计数减少1。指定处理程序的最后一

什么时候必须按事件使用此运算符?它的用途是什么?

删除Eventhandler函数。

正如+=向您订阅事件的处理程序一样,-=取消订阅

当您不再希望在引发事件时调用特定处理程序时,请使用它。您通常只需要使用它,因为引发事件的组件在逻辑上比事件处理程序的寿命更长—如果您不取消订阅,“事件引发程序”实际上有一个对处理程序的引用,因此可以使其比您想要的时间更长

如评论所述:

  • -=
    将只删除一个处理程序;如果订阅了多个处理程序(即使使用完全相同的委托),它仍然只会将处理程序计数减少1。指定处理程序的最后一个实例是已删除的实例。(因此,如果您以前让处理程序A、B、A、C按该顺序订阅,并删除了A,那么您最终将得到A、B、C。)
  • -=
    如果指定的处理程序尚未订阅委托,则不会导致错误;它只是忽略了请求。即使事件目前没有订阅任何处理程序,这也是正确的

正如您可以通过
+=
添加事件处理程序一样,您也可以通过
-=
删除它们

例如:

mybutton.Click += new EventHandler(myhandler);
以后可以按如下方式删除它:

mybutton.Click -= new EventHandler(myhandler);

…因为同一方法和实例的事件处理程序是等效的(因此您不需要保留对与
+=
一起使用的处理程序的引用,也不需要将该处理程序与
-=
一起使用)。

可以在C中使用
+=
-=
操作符,将事件处理程序添加到对象的事件中或从对象的事件中删除事件处理程序:

// adds myMethod as an event handler to the myButton.Click event
myButton.Click += myMethod;
上述代码运行后,每次单击
myButton
时都会调用
myMethod
方法

// removes the handler
myButton.Click -= myMethod;

上述代码运行后,单击
myButton
将不再导致调用
myMethod

我怀疑+=的后台逻辑是将处理程序添加到给定事件的事件处理程序列表/数组中。使用-=时,它会将您的右参数与它为此事件保留的事件处理程序列表进行比较,并将其从列表中删除。如果对给定事件执行多个+=操作,则将调用每个处理程序

换言之: +=表示在事件发生时将方法添加到要调用的方法列表中。 -=表示从要调用的方法列表中删除指定的方法


如果全部删除,事件将没有处理程序,事件将被忽略。

+1。还值得一提的是,未能取消订阅事件通常是导致程序内存不足的原因,因为它会阻止对象符合GC的条件。Jon,我有点害怕我们两人在回答问题时都以“正如…”开头;-)什么是VB.NET版本的
-=
。我的意思是如何取消订阅活动?@dotnebeginner:我不知道,但我相信如果您查看有关MSDN上事件的VB特定文档,您会得到答案。提及无操作场景也会有所帮助。也就是说,如果处理程序一开始没有订阅,那么使用-=来“取消订阅”它不会抱怨。我刚刚测试了这个,甚至能够在null事件上使用-=而不会崩溃——大概是因为-=是语法糖。。。?