如果指定了"new"事件,如何删除事件处理程序 - =工作

jph*_*ann 18 c# events event-handling

在MSDN 事件教程中,通过示例演示了事件:

// Add "ListChanged" to the Changed event on "List":
List.Changed += new ChangedEventHandler(ListChanged);
...
// Detach the event and delete the list:
List.Changed -= new ChangedEventHandler(ListChanged);
Run Code Online (Sandbox Code Playgroud)

我在哪里一直提到代表.例:

ChangedEventHandler myChangedEvent = new ChangedEventHandler(ListChanged);
List.Changed += myChangedEvent;
...
List.Changed -= myChangedEvent;
Run Code Online (Sandbox Code Playgroud)

当我查看MSDN示例代码时," - = new"对我来说是错误的.为什么这个List会引用我刚刚创建的事件处理程序?

显然我必须以错误的方式思考问题?我是否可以获得指向如何 - =工作的技术解释的指针,看看 - =似乎没有使用它.

Han*_*ant 20

是的,这是令人困惑的语法.必须先创建委托对象,然后才能从事件中删除处理程序.这也是C#支持这种语法的原因:

 List.Changed -= ListChanged;
Run Code Online (Sandbox Code Playgroud)

这看起来更合乎逻辑.然而,编译器仍然生成完全相同的代码.在引擎盖下,MulticastDelegate.RemoveImpl()方法迭代调用列表并从目标和方法属性匹配的列表中删除委托对象.


Cod*_*aos 10

事件取消订阅使用值相等,而不是引用相等.因此新创建的委托与旧的委托匹配(目标对象和方法都相同),从而从调用列表中删除旧委托.