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

时间:2009-04-03 14:16:20

标签: c# events

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是未注册的吗?

2 个答案:

答案 0 :(得分:7)

是;委托在实例和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;

答案 1 :(得分:0)

尝试使用

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

这也应该有效(来自内存 - 尚未真正测试过)。至少它不会创建一个新的eventhandler-reference。