c#事件

原创 Laughing  2018-03-08 00:24  阅读 516 次 评论 0 条

事件是C#中另一高级概念,使用方法和委托相关。奥运会参加百米的田径运动员听到枪声,比赛立即进行。其中枪声是事件,而运动员比赛就是这个事件发生后的动作。不参加该项比赛的人对枪声没有反应。

从程序员的角度分析,当裁判员枪声响起,发生了一个事件,裁判员通知该事件发生,参加比赛的运动员仔细听枪声是否发生。运动员是该事件的订阅者,没有参赛的人不会注意,即没有订阅该事件。

C#中使用事件需要的步骤:
1、创建一个委托;
2、将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联C#事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名);
3、编写C#事件处理程序;
4、利用编写的C#事件处理程序生成一个委托实例;
5、把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。

我们用一个简单的例子,来说明一下这种消息传递的机制。

  有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。

  妈妈有一个方法,叫做“做饭”。有一个事件,叫做“开饭”。做完饭后,调用开发事件,发布开饭消息。

  爸爸和孩子分别有一个方法,叫做“吃饭”。

  将爸爸和孩子的“吃饭”方法,注册到妈妈的“开饭”事件。也就是,订阅妈妈的开饭消息。让妈妈做完饭开饭时,发布吃饭消息时,告诉爸爸和孩子一声。

  这种机制就是C#中的,订阅发布。下面我们用代码实现:

  1. class Program  
  2.     {  
  3.         public static void Main(string[] args)  
  4.         {  
  5.             //实例化对象  
  6.             Mom mom = new Mom();  
  7.             Dad dad = new Dad();  
  8.             Child child = new Child();  
  9.               
  10.             //将爸爸和孩子的Eat方法注册到妈妈的Eat事件  
  11.             //订阅妈妈开饭的消息  
  12.             mom.Eat += dad.Eat;  
  13.             mom.Eat += child.Eat;  
  14.               
  15.             //调用妈妈的Cook事件  
  16.             mom.Cook();  
  17.               
  18.             Console.Write("Press any key to continue . . . ");  
  19.             Console.ReadKey(true);  
  20.         }  
  21.     }  
  22.       
  23.     public class Mom  
  24.     {  
  25.         //定义Eat事件,用于发布吃饭消息  
  26.         public event Action Eat;  
  27.           
  28.         public void Cook()  
  29.         {  
  30.             Console.WriteLine("妈妈 : 饭好了");  
  31.             //饭好了,发布吃饭消息  
  32.             Eat?.Invoke();  
  33.         }  
  34.     }  
  35.       
  36.     public class Dad  
  37.     {  
  38.         public void Eat()  
  39.         {  
  40.             //爸爸去吃饭  
  41.             Console.WriteLine("爸爸 : 吃饭了。");  
  42.         }  
  43.     }  
  44.       
  45.     public class Child  
  46.     {  
  47.         public void Eat()  
  48.         {  
  49.             //熊孩子LOL呢,打完再吃  
  50.             Console.WriteLine("孩子 : 打完这局再吃。");  
  51.         }  
  52.     }  
本文地址:https://www.lisen.me/csharp-event-simple-demo.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情