2

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

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

也没有提供详细说明为什么会这样的评论。为什么要这样做?

4

4 回答 4

4

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

为什么要这样做?

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

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

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

于 2012-08-06T19:03:25.693 回答
2

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

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

于 2012-08-06T19:04:34.533 回答
1

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

我注意到:

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

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

于 2012-08-06T19:06:25.403 回答
1

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

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

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

于 2012-08-07T13:39:29.223 回答