.NET漫游指南-011-.NET Framework中处理和引发事件

来源:互联网 发布:淘宝老瑞贸易可信吗 编辑:程序博客网 时间:2024/05/21 09:31

参考网址:https://msdn.microsoft.com/zh-cn/library/edzehd2t(v=vs.110).aspx

在之前的几篇博文中主要是从实用角度来讲委托和事件委托以及事件的触发和调用,010,011等后续几篇blog主要从理论方向来进行解释。

在.NET Framework中事件是基于委托模式的。委托模式遵循观察者设计规范,观察者模式使得订阅者嗯那个够进行注册并接受发布者发布的消息。

事件的发布者推送一条事件引发的消息,改事件的订阅者接收到改消息并对对改消息进行处理。下面主要讲述委托模式的主要组件,如何在应用中使用

事件以及如何在代码中实现事件。

事件

事件是由一个对象发送的一条消息来表明某个动作的发生。这个动作可能是由于用户交互引起的,例如按钮的点击,也可能是由程序的逻辑引起的,例如改变一个属性的值。引发事件的对象我们称为事件的发送者。事件的发送者并不知道哪个对象或者方法将会接收处理它所引发的事件。事件通常是事件发送者的一个成员;例如,Click事件是button类的一个成员,propertyChanged事件是实现了INotifyPropertyChanged接口的类的一个成员。为了定义一个事件,我们在c#中使用关键词event在我们的事件类中,同时要specify事件委托的类型。委托的相关内容在之前的几篇blog中有讲。

一般来说,为了触发一个事件,我们需要添加一个被protected virtual修饰的方法,同时以OnEventName的方式命名该方法,例如OnDataRecevied。这个方法应该带有指定事件数据类型的对象作为一个参数。我们提供这个方法使得我们可以派生类来重写引发事件的逻辑。派生类必须始终调用基类中OnEventName的方法来确保所注册的委托能够接收到事件。

下面的例子来讲述如何声明一个事件委托(例子中叫ThresholdReached),这个事件与EventHandler委托相关联,并且会被一个叫OnThresholdReached的方法触发。

class Counter{    public event EventHandler ThresholdReached;    protected virtual void OnThresholdReached(EventArgs e)    {        EventHandler handler = ThresholdReached;        if (handler != null)        {            handler(this, e);        }    }    // provide remaining implementation for the class}

委托

委托是一种支持引用的类型。委托声明的签名方式是通过返回类型和它引用的方法的参数来进行定义的,委托仅能处理和它签名相同的方法的引用。这样来看,委托其实就是一种安全类型的函数指针或者一种安全类型的回调。委托的声明就足以来定义一个委托类,也就是说没有必要去单独定义一个委托类。委托在.NET中有很多应用。在上下文事件中,委托是事件源和事件处理逻辑之间的一种媒介(也可以认为是一种指针)。我们可以通过在事件声明中包含委托类型的方法,来关联委托和事件。.NET提供了EventHandler和EventHandler<TEventArgs>委托来支持绝大部分形式的事件场景(event scenarios)。当使用EventHandler委托来处理事件时不需要包含任何事件数据。当使用EventHandler<TEventArgs>委托来处理事件时,需要包含该事件的相关数据。一些特殊的委托没有返回类型并且只包含两个参数(这两个参数中,一个时事件源,一个是事件数据)

委托是多广播的,这就意味着委托能同时引用处理多个事件处理方法(就是用+=来处理多个事件订阅的方法).关于委托引用的更多细节,后面我会再做记录。


  • Add to Phrasebook
    • No wordlists for English -> Simplified Chinese...
    • Create a new wordlist...
  • Copy
原创粉丝点击