委托与事件

来源:互联网 发布:linux cat怎么退出 编辑:程序博客网 时间:2024/06/01 14:39

一.委托

委托使用分三步:1.委托声明。2.委托实例化。3.委托调用。

例程一:

using System;

namespace 委托

{

  delegate int WeiTuo(int a,int b);      //第一步:委托声明  

        class Class1

         {

    static void Main(string[ ] args)

                 {

      Class1 c1=new Class1();

                        WeiTuo w=new WeiTuo(c1.Add);       //委托实例化

                        Console.WriteLine(w(1,2));               //委托调用

                 }

                  private int Add(int x,int y)

                    {

        return x+y;

                    }

         }

}  

  例中委托w引用了方法Add。

  委托声明了以后,就可以像类一样进行实例化,实例化时把要引用的方法做为参数,

   这样委托和方法就关联起来了,就可以用委托来引用方法了。

   委托和所引用的方法必须保持一致:

   1.参数个数,类型,顺序必须完全一致。

   2.返回值必须一致。

二.事件

  有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们

  中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。

  比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:

   button1.Click+=new EventHandler(button_Click);按下按钮后就会触发button1_Click方法进行处理。

   EventHandler就是系统类库里已经声明的一个委托。

三.自定义事件及其处理

     EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:
     delegate void 事件委托名(object  sender, EventArgs  e);

    object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。I
    例程二:

    using System;

   namespace 最简单的自定义事件

  {

  // 事件发送类

     class Class1

     {

   public  delegate  void  UserRequest(object sender, EventArgs e);   // 声明委托

          public  event  UserRequest  OnUserRequest;      // 定义一个委托类型的事件

          public  void  run()

          {

    OnUserRequest(this, new EventArgs());        // 产生事件

          }

     }

    class Class2

    {

  static  void  Main(string [ ]  args)

       {

       Class1  c1=new  Class1();

              c1.OnUserRequest+=new   Class1.UserRequest(c1_OnUserRequest);    // 委托实例化后绑定到事件

              c1.run();             

       }

       public  static  void  c1_OnUserRequest(object  sender, EventArgs  e)

        {

        //  事件处理方法

              Console.WriteLine("你触发了事件!");

        }

   }

  }

例程三:

   using System;

   namespace 带事件数据的事件

   {

  //  带事件数据的事件类,从EventArgs继承

       class OnUserRequestEventArgs : EventArgs
       {

   public  string  inputText;

       }

       class  Class1

       {

                     //  事件发送类

          public  delegate  void  UserRequest(object  sender,OnUserRequestEventArgs  e);   //  声明委托

          public  event  UserRequest  OnUserRequest;    //  定义一个委托类型的事件

          public  run()

          {

                OnUserRequestEventArgs  e1 = new   OnUserRequestEventArgs( );

                 e1.InputText = a;
                 OnUserRequest(this,e1);

          }

       }

    class Class2

     {

    //  事件接收类

         static  void  Main(string[ ] args)
           {

           Class1 c1 = new Class1();

                 c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);
                  c1.run();

           }

            private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)
            {

                      Console.WriteLine("/t你输入的是:"+e.InputText);

            }

     }

   }

例程三跟例程二唯一的差别在于自定义了一个类OnUserRequestEventArgs,从EventArgs继承。

原创粉丝点击