我注意到我们的 .NET WinForms 应用程序中的有趣行为。我们有一个 MDI 表单,其中添加了许多 MDI 子项。这些子窗体监听“广播”事件,该事件本质上是调用刷新自身。该事件在基类中声明,并在子窗体中添加侦听事件。
我注意到,即使这些子窗体关闭,如果未在 Dispose() 方法中显式删除事件,事件仍然会被触发。
这背后的原因是什么?当然,如果表单关闭,事件应该被分离/处理吗?是因为实际事件本身是在外部类中声明的吗?这就是我的假设。
洞察力将不胜感激。
(使用 C#、.NET 3.5)
该事件仍然在作用域内,因为它位于主窗体上,仍然具有对子窗口中委托的引用。因此,关闭窗口不会处理该对象,因为它仍然在该引用的范围内。这是 .NET 中出现“内存泄漏”的一种非常常见的方式。还要考虑到,因为子窗口仍在范围内,所以窗口内的所有内容仍然在范围内,也不会被收集。
至于为什么窗口在关闭时不分离所有事件处理程序。如果确实如此,那将是非常奇怪的行为。仅仅因为您关闭了一个窗口并不意味着您已经完成了它,您可以重新打开它,将其中的数据保存到持久状态。与调用任何其他方法相比,在窗口上调用 close 没有特殊属性,它不会释放窗口、将其标记为收集或其他任何内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)