事件

     我们可以将事件看做是类似于属性(property)的东西.首先都声明为具有一种特定的类型。对事件来说,必须是一个委托类型。使用属性时,感觉就像是直接对它的字段进行取值和赋值,但你实际上是在调用方法,也就是取值方法和赋值方法。实现属性时,可以在那些方法中做你喜欢做的任何事。但凑巧的是大多数属性都只是实现了简单的字段,有的会加一些校验机制。

     同样,在订阅或取消订阅一个事件时,看起来就像是通过+=和-=操作符使用委托类型字段。但和属性的情况一样,这个过程实际是在调用方法(add和remove方法)。对于一个纯粹的事件,你所能做的事情就是订阅(添加一个事件处理程序)或者取消订阅(删除一个事件处理程序)。最终是由事件方法来做真正有用的事情。

      事件存在的理由和“属性”差不多————它们添加了一个封转层,实现发布/订购模式。通常我们不希望其他代码能直接设置字段值,最起码也要先由所有者对新值进行验证。同样,我们不希望类外部代码随意更改(或调用)一个事件的处理程序。

     字段风格的事件使得所有这些的实现变得更易阅读————只需要一个声明就可以了。编译器会将声明转换成一个具有默认add/remove实现的事件和一个具有私有委托类型的字段。类内的代码能看见字段,类外的代码只能看见事件。这样一来,表面上似乎能调用一个事件,但为了调用事件处理程序,实际做的事情是调用存储在字段中的委托实例。

      以下摘自《CLR  via C#》:

      如果类型定义了事件成员,那么类型(或者类型实例)就可以通知其它对象发生了特定的事情。例如Button类提供了一个名为Click的事件,应用程序中的一个或多个对象可能想接收关于这个事件的通知,以便在Button被单击之后采取某些操作。事件是实现这种交互的类型成员。C#中事件成员的定义使用关键字event来定义。每个事件成员都要指定以下内容:一个可访问性标识符(几乎肯定是public,这样其他代码才能访问该事件成员);一个委托类型,它指出要调用的方法的原型;以及一个名称(可以是任意有效的标识符)。以下是一个类中的事件成员:

    public event EventHandler<NewailEventArgs> Newmail;

    Newmail 是这个事件的名称,事件成员的类型是EventHandler<NewMailEventArgs>,意味着“事件通知”的所有接受者都必须提供一个原型和EventHandler<NewMailEventArgs>委托类型匹配的回调方法。由于泛型System.EventHandler委托类型的定义如下:

    public delegate void EventHandler<TEventArgs> (Object sender,TEventArgs e) where TEventrgs:EventArgs;

    所以方法原型必须具有以下形式:void MethodName(Object sender,NewMailEventArgs e);

    引自MSDN:EventArgs 是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。例:

   因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,来保存按键信息,好让后面知道按了哪个键。

internal class KeyEventArgs : EventArgs
{
    
private char keyChar;
    
public KeyEventArgs( char keyChar ) : base()
    
{
        
this.keyChar = keyChar;
    }


    
public char KeyChar
    
{
        
get
        
{
            
return keyChar;
        }

    }

}

我个人对事件用来在类间交互的理解:

以事件发布类和事件接收类来说,事件发布类需要具备的是事件的声明和触发事件的方法。当然事件的声明需要一个委托类型。事件触发的方法中最简单的代码包括检查是否有对象登记了对事件的关注,如果有,则引发事件。事件接收类中最简单的需要提供一个事件处理方法,如果在某个事件被触发时希望接收到发布类的消息,就需要将自己的事件处理方法登记到发布类的事件上。(类似如果你订阅了杂志,则至少要留给发行商邮寄的地址或其他联系方式。)

 

 

posted @ 2013-01-21 15:14  息晴海  阅读(141)  评论(0编辑  收藏  举报