c# – 使用新委托实例取消注册事件
发布时间:2020-12-16 01:30:16 所属栏目:百科 来源:网络整理
导读: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()); } 这写得相同
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()); } 这写得相同!到控制台. 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |