我的理解是,在 C# 中连接的任何事件处理程序都需要取消连接。
Object myObject = new Object();
myObject.Event += EventHandler; //Wired
myObject.Event -= EventHandler; //Unwired
但是您需要取消以下代码吗?如果是这样,怎么办?
Object myObject = new Object();
myObject.Event += (object sender, EventArgs e) => { }; //Wired
myObject.Event -= ????? //Unwire? How?
我的假设是不是?
是的,您需要 (*) 并且需要这样做:
Object myObject = new Object();
EventHandler handler = (object sender, EventArgs e) => { };
myObject.Event += handler; //Wired
myObject.Event -= handler; //Unwired
See here https://stackoverflow.com/questions/6200424/event-fires-more-and-more-times/6200458#6200458以获得解释。
(*)
由于垃圾收集,您不需要这样做。如果您不想让事件再调用您的处理程序,则需要执行此操作。
UPDATE:
澄清一下:
您想要取消连接事件处理程序的唯一原因是定义事件处理程序的对象可以被垃圾收集。
考虑下面的例子:
- 你有课
PowerSource
有一个事件BlackOut
.
- 你有课
LightBulb
只要有电,它就会开启。它有一个方法ConnectToPowerSource
。该方法订阅了BlackOut
所提供的事件PowerSource
.
- 您有一个包含灯泡的集合
现在,简单地从列表中删除灯泡不会使其被垃圾收集,因为PowerSource
仍然保留对LightBulb
其实例BlackOut
事件。只有注销后LightBulb
来自BlackOut
事件将使LightBulb
收集垃圾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)