为每个可能的事件定义事件处理程序(即使未使用它们)背后的原因是什么?



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

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

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

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

为什么要这样做?

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

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

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

这不是理想的情况。事实上,大多数winforms控件都使用EventHandlerList,它被设计为稀疏事件的高效存储模型。如果您正在为要子类化的东西(窗体等)重写事件,那么override是事件订阅的首选选项。

听起来好像有人在IDE中双击事件,使其全部变为粗体。它没有任何用处。

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

我注意到:

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

因此,我将坚持YAGNI原则,并迅速将其删除。

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

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

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

最新更新