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

时间:2011-10-24 21:10:32

标签: c# events event-handling

在MSDN Events Tutorial中,通过示例演示事件:

// 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);

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

ChangedEventHandler myChangedEvent = new ChangedEventHandler(ListChanged);
List.Changed += myChangedEvent;
...
List.Changed -= myChangedEvent;

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

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

2 个答案:

答案 0 :(得分:20)

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

 List.Changed -= ListChanged;

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

答案 1 :(得分:10)

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