我在 C# 工作,我的工作场所有一些代码标准。其中之一是我们连接的每个事件处理程序(例如KeyDown
)都必须在Dispose
方法中断开连接。这有什么充分的理由吗?
最佳答案
除非您希望事件的发布者比订阅者活得更久,否则没有理由删除事件处理程序,不。
这是民间传说发展起来的主题之一。你真的只需要用正常的术语来考虑它:发布者(例如按钮)有一个对订阅者的引用。如果发布者和订阅者同时有资格进行垃圾回收(这很常见),或者发布者更早有资格进行垃圾回收,那么就不存在 GC 问题。 p>
静态事件会导致 GC 问题,因为它们实际上是一个无限长生命周期的发布者 - 我会尽可能完全阻止静态事件。 (我很少发现它们有用。)
另一个可能的问题是,如果您明确想要停止监听事件,因为如果引发事件,您的对象将行为不端(例如,它将尝试写入已关闭的流)。在那种情况下,是的,您应该删除处理程序。这很可能是在您的类已经实现了 IDisposable
的情况下。实现 IDisposable
只是 以删除事件处理程序是不寻常的 - 尽管并非不可能 - 是值得的。
关于c# - 我应该始终断开 Dispose 方法中的事件处理程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399991/