有关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 += new MyDeleGate(s_eventMyDele); }

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

       public   void s_eventMyDele()

        {

           Console.WriteLine ("hello") ;

        }

    }

 

    class Accept2

    {

        public Accept2(Send send)

        {

            send.eventMyDele += new MyDeleGate(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 = new SendEventArgs("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, SendEventArgs e)  //要加上object sender, EventArgs  e

        {

           Console.Write("hello") ;

        }

    }

 

    class Accept2

    {

        public Accept2(Send send)

        {

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

       

        }

 

        void send_eventMyDele(object sender, SendEventArgs e)

        {

            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#事件总结

上一篇:常用的Dos命令


下一篇:How to install DIG dns tool on windows 7