【问题标题】:What's the benefit of manually adding / removing event handlers, instead of assigning them through the UI?手动添加/删除事件处理程序而不是通过 UI 分配它们有什么好处?
【发布时间】:2014-03-03 01:05:00
【问题描述】:

在工作中,我的老老板会坚持我们以编程方式在后面代码中的控件中分配和删除事件处理程序,而不是简单地双击一个按钮(例如)。

我们在每个表单上都有一个 AttachEvents()DetachEvents() 方法。我不记得他解释过为什么据称这比从设计视图中分配更好,而且他后来被转移到另一个项目。我的新经理不知道。

认为他说这与未正确从内存中删除的事件有关,但我真的不知道。

那么:这样做有什么好处?

【问题讨论】:

  • 因为您将更好地控制附加和分离事件处理程序,是的,有时您可能需要从运行时分离事件处理程序。这就是为什么知道如何附加/分离事件处理程序的原因编码而不是设计师

标签: c# winforms events event-handling .net-3.5


【解决方案1】:

在性能方面它们是相同的。 但是在后面的代码中这样做是一种更简洁的方式,因为您可以控制何时使用 AttachEvents()DetachEvents()

但是您必须小心避免任何重复的事件连接。这些反过来可能会导致消耗内存,但很明显,它们会导致性能问题,因为事件处理程序会被调用多次。

【讨论】:

    【解决方案2】:

    在离开表单之前需要删除一些事件处理程序,例如计时器,否则它们仍然会触发,例如 timer.Elapsed += ... 和 timer.Elapse -= ... 记住以这种方式进行操作可能是一种很好且清晰的方法。

    【讨论】:

    • 在这里您应该停止计时器,而不是删除计时器,而是让它继续运行。那是在泄露资源。
    【解决方案3】:

    除了您自己的架构的影响之外,没有任何区别。

    设计器会将事件订阅放在InitializeComponent 方法上,您不应对该方法进行任何更改,因为如果它无法处理,设计器可能会覆盖它们或崩溃。

    通常,事件订阅是表单从其子项订阅的事件。当 from 关闭/dispose 时,所有子元素都被释放,每个子元素都会释放事件订阅。

    当表单订阅外部组件时会出现问题。然后表单会“附加”到这些组件,如果没有取消订阅,就会成为资源泄漏。

    当表单还没有准备好处理事件时,也有可能触发事件。

    我使用了一种混合方法,在设计器中订阅了来自子控件的事件(或在 InitializeComponent 方法中仔细手动编码),并对 UI 外部的组件使用了 AttachEvents/DetachEvents 方法(或表单/控件的范围)。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多