zoukankan      html  css  js  c++  java
  • 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 string StrText;
     5         public MyEventArgs(string StrText)
     6         {
     7             this.StrText = StrText;
     8         }
     9         public string GetStrText
    10         {
    11             get
    12             {
    13                 return StrText;
    14             }
    15         }
    16     }
    17 
    18     public class EventSource
    19     {//发布事件的类
    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 Test
    33     {//订阅事件的类
    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     }

      

        可以对照着上面的介绍,来找一下事件的几个相关元素。

    委托、Lamada表达式、事件的一些基础知识完。。。。

     这是我第一次写博客,本人也还是在大学里摸索的渣渣,几乎都是书上的一些内容,感觉自己一个字一个字打出来印象会比较深刻,理解也更到位,大神勿喷。。。

  • 相关阅读:
    Python中的类(上)
    Django REST Framework API Guide 07
    Django REST Framework API Guide 06
    Django REST Framework API Guide 05
    Django REST Framework API Guide 04
    Django REST Framework API Guide 03
    Django REST Framework API Guide 02
    Django REST Framework API Guide 01
    Django 详解 信号Signal
    Django 详解 中间件Middleware
  • 原文地址:https://www.cnblogs.com/czhwust/p/4356037.html
Copyright © 2011-2022 走看看