ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

事件是允许在动作发生的时候执行特殊应用程序代码的机制。事件既能够发生在被关联的动作发生之前(之前事件)又能够发生在动作发生之后(之后事件)。例如,当用户在窗口中单击一个按钮的时候,一个之后事件就被触发来允许执行特殊的应用程序方法。事件处理器的代理会绑定到将要在系统触发一个事件时被执行的方法。事件处理器被添加到事件,因此它能够在事件被触发的时候调用它的方法。并且事件还能够拥有特殊的事件数据(例如,一个鼠标单击事件能够包括与屏幕鼠标的位置有关的数据)。

事件处理方法的签名与事件处理器代理的签名是完全相同的。事件处理器的签名需要遵循下列约定:

  • 返回类型是 Void。
  • 第一个参数被命名为 sender 并且是一个 Object 类型。它是被触发了事件的对象。
  • 第二个参数被命名为 e 并且是一个 EventArgs 类型或一个 EventArgs 派生类。它是特殊的事件数据。
  • 这个方法正确地获取了上述两个参数。

更多关于事件的信息,请参考:[处理并触发事件]。

为事件使用触发术语要胜于引发或引起。
使用 System.EventHandler<T> 来替代手动创建与事件处理器一样被使用的新代理。

这个指导方针主要适用于新的特征区域。如果你扩大了使用非常规事件处理器区域中的功能,那么你可以继续使用非常规的事件处理器来保持设计的一致性。

如果库的 .NET Framework 目标版本不支持常规,那么你就不能够遵循这个指导方针。

考虑使用一个 System.EventArgs 派生类来作为事件的参量,除非你能够完全肯定事件从来不需要为事件处理方法而承载任何数据,在这种情况下你就可以直接使用 System.EventArgs 类型。

如果你定义了一个获取 EventArgs 实例来替代自定义派生类的事件,那么在后续版本中你就不能够再为这个事件添加任何数据。关于这个原因,更可取的方法就是创建一个空的 EventArgs 派生类。这允许你能够在后续版本中不需要引入破坏变化的情况下把数据添加到事件中。

使用一个被保护的虚拟方法来触发每个事件。但是这只适用于非密封类中的非静态事件,而不是结构、被密封的类,或者静态事件。

遵循这个指导方针允许派生类通过重载被保护的方法来处理基类的事件。被保护的(在 Visual Basic 中是 Overridable)虚拟方法的名称应该与以 On 作为前缀的事件名称是一样的。例如,名为 "TimeChanged" 的事件的被保护的虚拟方法应该被命名为 "OnTimeChanged"。

重要提示:重载了被保护的虚拟方法的派生类对于基类实现的调用并不是必需的。基类必须继续正确地工作,即使它的实现并没有被调用。

为触发事件的被保护方法而使用一个被类型化成事件参量类的参数。这个参数应该被命名为 e。

FontDialog 类提供了下列方法,并通过这个方法来触发 Apply 事件:

protected virtual void OnApply(EventArgs e);
在触发一个非静态事件的时候,不要把 null 值(在 Visual Basic 中是 Nothing)传递给 sender 参数。

在静态事件中,sender 参数应该是 null 值(在 Visual Basic 中是 Nothing)。

在触发一个事件的时候,不要把 null 值(在 Visual Basic 中是 Nothing)传递给事件的数据参数。

如果没有事件数据,就传递 Empty 来替代 null 值。

在事件处理方法中准备执行任意代码。

考虑把代码存放到事件被触发的 try-catch 块中以防止由于从事件处理器中抛出了未捕获的异常而导致的程序中止。

考虑触发能够被终端用户取消的事件。但是这只适用于之前事件。

如果你设计了一个可取消的事件,那么就与事件数据对象 e 的基类一样来使用 CancelEventArgs 替代 EventArgs。

posted on 2007-02-01 19:58  Laeb  阅读(289)  评论(0编辑  收藏  举报