使用新委托实例取消注册事件

EventHandler a = new EventHandler(control_RegionChanged); EventHandler b = new EventHandler(control_RegionChanged); if (a == b) { Console.WriteLine("Same!"); } else { Console.WriteLine(a.GetHashCode() + " " + b.GetHashCode()); } 

这写得Same! 到控制台。

 control.RegionChanged += new EventHandler(control_RegionChanged); control.RegionChanged -= new EventHandler(control_RegionChanged); 

执行此代码后, EventHandler未注册?

是; 委托在实例和MethodInfo上进行比较; 如果它们是相同的,那么它将起作用。 尝试取消订阅匿名方法时出现问题; 在这种情况下,您必须保留对代理人的引用才能取消订阅。

所以:

这可以:

 control.SomeEvent += obj.SomeMethod; //... control.SomeEvent -= obj.SomeMethod; 

但这风险更大:

 control.SomeEvent += delegate {Trace.WriteLine("Foo");}; //... control.SomeEvent -= delegate {Trace.WriteLine("Foo");}; 

使用匿名方法的正确过程是:

 EventHandler handler = delegate {Trace.WriteLine("Foo");}; control.SomeEvent += handler; //... control.SomeEvent -= handler; 

尝试使用

 control.RegionChanged += control_RegionChanged control.RegionChanged -= control_RegionChanged 

这也应该工作(从内存 – 还没有真正测试过它)。 至少它不会创建一个新的eventhandler-reference。