在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”对我来说似乎是错误的。为什么此列表引用我刚刚创建的事件处理程序?

显然我必须以错误的方式思考事情?我是否可以找到有关-=如何工作的技术说明的指针,看看-=似乎没有使用它。

最佳答案

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

 List.Changed -= ListChanged;

看起来更合逻辑。但是,编译器仍会生成完全相同的代码。在后台,MulticastDelegate.RemoveImpl()方法迭代调用列表,并从列表中删除其Target和Method属性匹配的委托(delegate)对象。

10-08 14:36