Csharp/C#教程:使用新委托实例取消注册事件分享


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

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。

上述就是C#学习教程:使用新委托实例取消注册事件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/985654.html

(0)
上一篇 2021年12月21日
下一篇 2021年12月21日

精彩推荐