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表达式、事件的一些基础知识完。。。。

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

  • 相关阅读:
    lambda表达式
    切片操作
    小样本学习(Few-shot Learning)
    TensorFlow Eager 模式
    tensorflow读入数据集的方式
    综述类解读
    pyCharm永久激活
    shell脚本教程
    GNN
    Tomcat配置优化
  • 原文地址:https://www.cnblogs.com/czhwust/p/4356037.html
Copyright © 2011-2022 走看看