c# - 我应该始终断开 Dispose 方法中的事件处理程序吗?

标签 c# .net events event-handling dispose

我在 C# 工作,我的工作场所有一些代码标准。其中之一是我们连接的每个事件处理程序(例如KeyDown)都必须在Dispose 方法中断开连接。这有什么充分的理由吗?

最佳答案

除非您希望事件的发布者比订阅者活得更久,否则没有理由删除事件处理程序,不。

这是民间传说发展起来的主题之一。你真的只需要用正常的术语来考虑它:发布者(例如按钮)有一个对订阅者的引用。如果发布者和订阅者同时有资格进行垃圾回收(这很常见),或者发布者更早有资格进行垃圾回收,那么就不存在 GC 问题。 p>

静态事件会导致 GC 问题,因为它们实际上是一个无限长生命周期的发布者 - 我会尽可能完全阻止静态事件。 (我很少发现它们有用。)

另一个可能的问题是,如果您明确想要停止监听事件,因为如果引发事件,您的对象将行为不端(例如,它将尝试写入已关闭的流)。在那种情况下,是的,您应该删除处理程序。这很可能是在您的类已经实现了 IDisposable 的情况下。实现 IDisposable 只是 以删除事件处理程序是不寻常的 - 尽管并非不可能 - 是值得的。

关于c# - 我应该始终断开 Dispose 方法中的事件处理程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399991/

相关文章:

c# - 将计时器添加到 Windows 窗体应用程序

c# - 在安装过程中选择 ClickOnce 应用程序的安装路径

javascript - 如何查看哪些 javascript 事件绑定(bind)到 HTML 元素?

c# - Active Directory 中的过滤器更改通知 : Create, 删除、取消删除

model-view-controller - Ext JS 4 - 理解 this.control、选择器和事件处理

c# - 如何告诉 unit ms test 从子文件夹而不是 root 中获取 CSV 文件?

c# - 在 Request.QueryString 中避免 NullReferenceException

c# - Entity Framework 复杂的树结构

c# - 在 WPF LineSeries DataPoint 上添加事件

c# - COM 无法启动编译为 AnyCPU 的进程外 .Net 服务器