【问题标题】:What is the reasoning behind defining event handlers for every possible event, even when they're not used?为每个可能的事件定义事件处理程序的原因是什么,即使它们没有被使用?
【发布时间】:2012-08-03 18:36:06
【问题描述】:

我在一个我应该更新的应用程序中发现了一些代码,它为控件的每个可能的事件定义了一个事件处理程序(或者至少是设计器中列出的所有事件,来自我能说的)。我以前从未见过这种情况,也不想在我的任何应用程序中实现它。

一个例子;启动日志记录操作的按钮会在Click 上开始操作。但是,所有其他事件处理程序也被绑定,从 AutoSizeChangedBackColorChanged 一直到 VisibleChangedValidating。除了Click,所有事件处理程序都是空的。据我目前所知,整个应用程序中的许多控件都会发生这种情况。

没有提供任何 cmets 详细说明为什么会出现这种情况。为什么要这样做?

【问题讨论】:

  • 有人可能添加了一些空的事件处理程序,以便他们在开发过程中有一个设置断点的地方,然后无法进行大扫除。

标签: c# winforms


【解决方案1】:

除了 Click 之外,所有事件处理程序都是空的。据我目前所知,整个应用程序中的许多控件都会发生这种情况。

为什么要这样做?

很可能是因为原作者不明白这是没有必要的。

没有很好的技术理由这样做。它实际上只是降低了性能,并没有带来任何好处。

请注意,许多人在他们自己的类上创建事件时,通常会订阅一个空的事件处理程序。这使得他们可以避免对订阅列表进行空检查。我怀疑这样做是为了防止这种情况的误导,尽管它通常是在事件发布端完成的,而不是等式的订阅端。

【讨论】:

    【解决方案2】:

    那是....不是理想的情况。事实上,大多数winforms控件都使用EventHandlerList,它被设计成一个高效的sparse事件存储模型。如果您要为子类化的事物(表单等)覆盖事件,那么override 是事件订阅的首选选项。

    听起来有人在 IDE 中通过双击事件将它们全部加粗。它没有任何用处。

    【讨论】:

      【解决方案3】:

      您通常可以删除空的事件处理程序。这可能是一位正在“考虑未来”并希望“如果我们需要”准备好一些代码的开发人员。

      我注意到:

      • 在需要时可以轻松创建事件处理程序。
      • 空事件处理程序是未使用的代码,使得重要部分难以找到阅读

      因此,我会坚持YAGNI 原则并及时删除它们。

      【讨论】:

      • 我计划删除它们,并且正在这样做。这是一个相当简单的应用程序,所以我几乎可以肯定,在可预见的将来,几乎所有这些事件处理程序都不会被使用。
      【解决方案4】:

      在旧版本的 Visual Studio 中,一旦您插入新的事件处理程序,当您删除事件处理程序方法时,它不会自动从 Designer.cs 文件中删除代码。您必须进入 Windows 窗体设计器生成的代码并查找/删除如下行:

      this.button1.Click += new System.EventHandler(this.button1_Click);
      

      否则,如果您删除了 button1_Click 方法,您会遇到构建错误。这是一种痛苦,这可能是他从不清理它们的原因。现在,当您删除事件处理程序方法时,它已经足够聪明了。

      【讨论】:

      • 此代码不在 designer.cs 文件中。我不是指绑定事件处理程序的代码(您在答案中包含的代码);我指的是 .cs 主文件中的实际方法声明。
      • 生产代码中空的和未使用的方法只是懒惰的编码。如果它是一个 API 并且有一些不推荐使用的方法,您可能会将方法签名留在那里,并带有一个不推荐使用的属性,该属性将开发人员指向新的实现。
      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多