首页 > 代码库 > 有关C#事件总结

有关C#事件总结

事件(发布者)发送者和事件接收者(订阅者)

 

 

                                        

                                                                                                                                                                                        

第一步:发送者类定义事件成员  

 

 

 第二步:在接收者类定义触发事件的方法

                                                  

 

          

   事件接收者(事件发生时得到通知 的类)   

 

 

第三步:当发送者触发事件时,该事件的方法列表所有处理程序都会被调用。

 

注意:

事件处理程序:由订阅者注册到事件的方法,在发布者触发事件时产生。通常事件处理程序方法可以定义在事件所在的类中,也可以定义在不同的类。

 

使用事件时的5个源代码组件

 

 

组件说明:

  委托类型声明 

事件和事件处理程序必须有共同的签名和返回类型,通过委托类型描述

  事件处理程序声明

订阅者类中会在事件触发式执行的方法声明。

  事件声明

声明事件为public

  事件注册

订阅者必须订阅事件才能在它触发时得到通知

  触发事件的代码 

发布者类中触发事件并导致调用注册的所有事件处理程序的代码。

    

声明事件

发布者类必须提供事件对象。

声明事件注意如下几点

  事件声明在一个类中

  需要委托类型的名称,任何附加到事件(如注册)的处理程序都必须与委托类型的签名和返回类型匹配。

  事件必须声明为public,这样其他类可以在它上面附加(注册)事件处理程序。

  不能使用对象创建表达式(new 表达式)来创建它的对象。

 

 

       事件是类的成员,还有事件声明需要委托类型的名字,可以声明一个委托类型。

 

如:public delegate  void MyDeleGate();    //声明委托

      

       class Send

       {

         public  event  MyDeleGate eventMyDele;  //声明委托类型事件

         

         public  void  OneventMyDele()     // 触发事件的代码的方法

         {

                  if(eventMyDele!=null)  //触发事件之前和null进行比较,查看是否含有注册的事件处理程序,如果事件是null,则没有注册程序,不能执行。(确认有方法可以执行)

                                       eventMyDele(); //触发事件                    跟调用方法一样。

          }      }

    class Accept1

    {

        public Accept1(Send s)

        { s.eventMyDele += newMyDeleGate(s_eventMyDele); }

//使用+=运算符为事件增加事件处理程序。事件处理程序位于该运算符的右边。

       public  void s_eventMyDele()

        {

           Console.WriteLine("hello") ;

        }

    }

 

    class Accept2

    {

        public Accept2(Send send)

        {

            send.eventMyDele += newMyDeleGate(send_eventMyDele);

        //使用+=运算符为事件增加事件处理程序。事件处理程序位于该运算符的右边。

        }

 

        void send_eventMyDele()

        {

           Console.WriteLine("world");

        }

      }

    class Program

    {

        static void Main(string[] args)

        {

            Send s = new Send();

            Accept1 ac1 = new Accept1(s);

            Accept2 ac2 = new Accept2(s);

            s.OneventMyDele();

 

            Console.ReadKey(true);

        }

    }

}

 

 

标准事件的用法

Windows应用程序是基于事件驱动的 ,在程序运行时,它可以在任何时候被事件打断。对于事件的使用,.NET框架提供了一个标准模式。

事件使用的标准模式根本就是System命名空间声明的EventHandle委托类型。

public delegate void EventHandler(object sender, EventArgs e);

 

注意:

EventHandler委托类型的第二个参数是EventArgs类的对象,它声明在System命名空间中。

 EventArgs设计为不能传递任何数据。(是个空类,没有成员)

用于不需要传递数据的事件处理程序。

object, EventArgs 是基类,这样EventHandler能提供一个对所有事件和事件处理程序都通用签名。

把上面程序改用标准事件

//public delegate  void MyDeleGate();

       class  Send

       {         public event EventHandler   eventMyDele;

               public void  OneventMyDele()

          {                  if(eventMyDele!=null)

                                 eventMyDele(this,null);   //有两个参数

           }

              }

 

   class Accept1

   {  public Accept1(Send s)

       { s.eventMyDele += new EventHandler(s_eventMyDele);} 

      public void s_eventMyDele(object sender,EventArgs e)  //要加上object sender,EventArgs  e

       { Console.WriteLine ("hello")  }

   }

   class Accept2

   {     public Accept2(Send send)

       {  send.eventMyDele += new EventHandler(send_eventMyDele);

       }

      void send_eventMyDele(object sender,EventArgs e)

       { Console.WriteLine("world"); }

     }

   class Program

   {

       static void Main(string[] args)

       {   Send s = new Send();

            Accept1 ac1 = new Accept1(s);

            Accept2 ac2 = new Accept2(s);

            s.OneventMyDele();

            Console.ReadKey(true);

       } }

}

通过扩展EventArgs来传递数据

为了向自己事件处理程序的第二个参数传入数据,并且又符合标准惯例,需要声明一个派生自EventArgs的自定义类,它可以保存我们需要传入的数据。以上题为例

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication1

{

   class SendEventArgs : EventArgs

    {

       public string message

       {

           get;private set;

       }

       public SendEventArgs(string m)

       {

           this.message = m;

       

       }

 

    }

        

         class  Send

         {

       public event EventHandler<SendEventArgs>eventMyDele;

           

            public void  OneventMyDele()  //在事件触发代码,给自定义事件参数类传递数据

            {

          SendEventArgs sed = newSendEventArgs("C# Study");

                      if(eventMyDele!=null)

                       

                         eventMyDele(this ,sed);   //有两个参数

             }

        

        

         }

 

   class Accept1

    {

       public Accept1(Send s)

       { s.eventMyDele += new EventHandler<SendEventArgs>(s_eventMyDele);}

 

       public void s_eventMyDele(object sender, SendEventArgse)  //要加上objectsender, EventArgs  e

       {

          Console.Write("hello") ;

       }

    }

 

   class Accept2

    {

       public Accept2(Send send)

       {

           send.eventMyDele += newEventHandler<SendEventArgs>(send_eventMyDele);

       

       }

 

       void send_eventMyDele(object sender, SendEventArgse)

       {

           Console.WriteLine("world"+e.message );

       }

     

   

    }

   class Program

    {

       static void Main(string[] args)

       {

           Send s = new Send();

           Accept1 ac1 = new Accept1(s);

           Accept2 ac2 = new Accept2(s);

           s.OneventMyDele();

 

           Console.ReadKey(true);

       }

    }

}

有关C#事件总结