使用新委托实例取消注册事件
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