你的位置:首页 > 软件开发 > ASP.net > C#基础加强篇—委托、Lambda表达式和事件(下)

C#基础加强篇—委托、Lambda表达式和事件(下)

发布时间:2015-03-21 20:00:19
3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起。事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送 ...

C#基础加强篇—委托、Lambda表达式和事件(下)

3.事件

      事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起。事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方,捕获事件并对其做出响应的对象叫做事件接收方。

      C#事件是按“发布——预定”的方式工作。先在一个类中公布事件,然后就可以在任意数量的类中对事件预定。在事件通信中,事件发送方类并不知道哪个对象或方法将接收到(处理)它所引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制),这一媒介就是委托。

 

      事件功能是由3个互相联系的元素提供:提供事件数据的类、事件委托和引发事件的类。如果想要类引发名为EventName的事件,需要以下元素:

        (1)持有事件数据的类:名为EventNameEventArgs。该类必须继承System.EventArgs类。如果不自定义持有事件数据的类,就使用System.EventArgs类。

        (2)事件的委托:名为EventNameEventHandler

        (3)引发该事件的类。该类必须提供:

                  a.事件声明:public event EventNameEventHandler  EventName;

                  b.引发事件的方法:名为OnEventName

       (4)定义使用此事件的类。所有这些类都应该包括:

                 创建事件源对象。使用定义的构造函数创建包含事件定义的类的对象。

                 定义事件处理程序,也就是定义与事件关联的方法。

                 将事件源对象注册到事件处理处理程序。使用委托对象和“+=”运算符和“-=”运算符将一个或多个方法与事件源中的事件关联。

 

      C#事件机制基于委托实现,首先要定义一个委托:

               public delegate void EventHandler(object from,myEventArgs e); //from表示发生事件的对象

      声明事件的格式:event 事件的委托名 事件名

               public event EventHandler TextOut;

      事件的激活一般写成:

              if(TextOut!=null)

                     TextOut(this,new EventArgs());

       订阅事件  +=  evsrc.TextOut+=new EventSource.EventHandler(CatchEvent);

        取消订阅  -=  evsrc.TextOut-=new EventSource.EventHandler(CatchEvent);

       

       下面再来看一个示例:

       

 1  public class MyEventArgs:EventArgs 2   { //定义事件包含数据 3     4     private get='_blank'>string StrText; 5     public MyEventArgs(string StrText) 6     { 7       this.StrText = StrText; 8     } 9     public string GetStrText10     {11       get12       {13         return StrText;14       }15     }16   }17 18   public class EventSource19   {//发布事件的类20    21     MyEventArgs EvArgs = new MyEventArgs("触发事件");22     public delegate void EventHandler(object from, MyEventArgs e);//定义委托23     public event EventHandler TextOut;//定义事件24     public void TriggerEvent()//激活事件的方法25     {26       if(TextOut!=null)27       {28         TextOut(this, EvArgs);29       }30     }31   } 32   class Test33   {//订阅事件的类34     static void Main(string[] args)35     {36       EventSource evsrc = new EventSource();37       evsrc.TextOut += new EventSource.EventHandler(CatchEvent);//订阅事件38       evsrc.TriggerEvent();//触发事件39       Console.WriteLine("--------------");40 41       evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);//取消订阅事件42       evsrc.TriggerEvent();//由于订阅已取消,什么也不执行43       Console.WriteLine("--------------");44 45       Test theApp=new Test();46       evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch);47       evsrc.TriggerEvent();48     }49     private static void CatchEvent(object from, MyEventArgs e)50     {//事件处理程序51       Console.WriteLine("CatchEvent:{0}", e.GetStrText);52     }  53     private void InstanceCatch(object from, MyEventArgs e)54     {//事件处理程序55       Console.WriteLine("InstanceCatch:{0}", e.GetStrText);56     }57   }

原标题:C#基础加强篇—委托、Lambda表达式和事件(下)

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录