C#事件删除语法

Mar*_*k T 8 c# events handler

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

Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove
Run Code Online (Sandbox Code Playgroud)

"new"在每一行上创建一个新对象,因此您添加一个对象,然后要求它删除另一个对象.

这可以起到什么作用?
从语法来看肯定不明显.

Cha*_*ana 19

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

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

在此上下文中,重写'equals'方法(对于delegate()),以便它仅比较委托的目标和methodPtr,即使您已创建要传递给Remove的新委托,它也将是相同的...


wom*_*omp 7

"新的MyHandler"实际上是多余的.你可以干脆做

Something += HandleSomething; // add
Something -= HandleSomething; // remove
Run Code Online (Sandbox Code Playgroud)

C#中的所有事件都是多播委托,因此+ =和 - =语法表示您正在向将要调用的委托列表添加/删除委托.

至于幕后发生的事情,我发现的最好的解释是Jon Skeet.