zoukankan      html  css  js  c++  java
  • 事件和委托

    事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。

    在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。

    委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。下面的示例显示了事件委托声明。

    C#

    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);

     

    该语法与方法声明的语法相似,但是 delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。

    AlarmEventHandler 委托的实例可以绑定到任何一个与其签名匹配的方法上,例如下面的示例中显示的 WakeMeUp 类的 AlarmRang 方法。

     

    C#

    public class WakeMeUp

    {

        // AlarmRang has the same signature as AlarmEventHandler.

        public void AlarmRang(object sender, AlarmEventArgs e)

        {...};

        ...

    }

     

    只有当事件生成事件数据时才需要自定义事件委托。许多事件,包括一些用户界面事件(例如鼠标单击)在内,都不生成事件数据。在这种情况下,类库中为无数据事件提供的事件委托 System.EventHandler 便足够了。其声明如下。

    C#

    delegate void EventHandler(object sender, EventArgs e);

     

    事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。有关详细信息,请参见 Delegate。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。

    委托示例

    using System;

    public class SamplesDelegate {

     

       // Declares a delegate for a method that takes in an int and returns a String.

       public delegate String myMethodDelegate( int myInt );

     

       // Defines some methods to which the delegate can point.

       public class mySampleClass {

     

          // Defines an instance method.

          public String myStringMethod ( int myInt ) {

             if ( myInt > 0 )

                return( "positive" );

             if ( myInt < 0 )

                return( "negative" );

             return ( "zero" );

          }

     

          // Defines a static method.

          public static String mySignMethod ( int myInt ) {

             if ( myInt > 0 )

                return( "+" );

             if ( myInt < 0 )

                return( "-" );

             return ( "" );

          }

       }

     

       public static void Main() {

     

          // Creates one delegate for each method.

          mySampleClass mySC = new mySampleClass();

          myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );

          myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );

     

          // Invokes the delegates.

          Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );

          Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );

          Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );

       }

     

    }

     

     

    /*

    This code produces the following output:

     

    5 is positive; use the sign "+".

    -3 is negative; use the sign "-".

    0 is zero; use the sign "".

    */

  • 相关阅读:
    类的静态成员
    QT上的Mysql编程
    将博客搬至CSDN
    ARM开发板系统移植-----rootfs的制作
    ARM开发板系统移植-----kernel的编译
    ARM开发板系统移植-----u-boot的编译
    Linux 消息队列编程
    Linux 共享内存编程
    Linux 信号量同步编程
    Linux 信号量互斥编程
  • 原文地址:https://www.cnblogs.com/gsk99/p/1904569.html
Copyright © 2011-2022 走看看