C# 事件基础知识

事件是什么

       一个事件代表程序中发生一件显著事情的信号。它包括事件的发送方和接收方。我们把触发事件的对象称为事件的发送者,响应事件的对象称为事件的接收者。在C#中,事件和委托经常联系在一块,他们的关系就是对象和类的关系。

       在C#的窗体应用开发中,.NET 中预定义了许多种专门用于事件的委托类型,比如 EventHandler、 KeyEventHandler、 MouseEventHandler 等。因此这里主要介绍怎么自定义一个事件。

怎么使用事件

 (1)使用事件其实就是一个创建事件驱动程序的过程。一般采取的步骤如下:

     1.声明关于事件的委托;
     2.声明事件;
     3.编写触发事件的函数;
     4.创建事件处理程序;
     5.注册事件处理程序;
     6.在适当的条件下触发事件。

    (2) 编写一个自定义事件。

       深林里有一只兔子和一只羊,晚上兔子睡觉的时候,羊负责看守洞口。如果有狼出没,羊就发出一个 Alarm 事件,兔子接到 Alarm 事件后就和羊一起采取行动。假设狼于 2017 年8月3日晚上12点整到达。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace eventDemo
 8 {
 9     class Sheep
10     { 
11         //1.声明关于事件的委托;
12         public delegate void AlarmEventHandler(object sender, EventArgs e);
13         
14         //2.使用event关键字声明事件;
15         public event AlarmEventHandler Alarm;  
16         
17         public void OnAlarm()      //3.编写引发事件的函数;
18         {
19             if (this.Alarm != null)
20                 this.Alarm(this, new EventArgs()); //发出警报
21         }
22     }
23         //事件接收者
24     class Rabbit
25     {
26         //4.编写事件处理程序
27         void RabbitHandleAlarm(object sender, EventArgs e)
28         {
29             Console.WriteLine("兔子: 狼来啦,快躲起来! ");
30         }
31         //5.注册事件处理程序;
32         public Rabbit(Sheep sheep)
33         {
34             sheep.Alarm += new Sheep.AlarmEventHandler(RabbitHandleAlarm);
35         }
36     }
37     //6.现在来触发事件
38     class Program
39     {
40         static void Main(string[] args)
41         {
42             Sheep sheep = new Sheep();
43             Rabbit rabbit = new Rabbit(sheep);
44             DateTime now = new DateTime(2017, 8, 2, 23, 59, 55);
45             DateTime midnight = new DateTime(2017, 8, 3, 0, 0, 0);
46             Console.WriteLine("时间一秒一秒地流逝,等待午夜的到来... ");
47             while (true)
48             {
49                 Console.WriteLine("当前时间: " + now);
50                 //午夜零点狼出没,羊引发 Alarm 事件
51                 if (now == midnight)
52                 {
53                     Console.WriteLine("\n 沙沙沙, 狼悄悄地来到了羊的附近...");
54                     //引发事件
55                     Console.WriteLine("\n 羊报警: 有狼出没,咩~~~~~~~");
56                     sheep.OnAlarm();
57                     break;
58                 }
59                 System.Threading.Thread.Sleep(1000); //程序暂停一秒
60                 now = now.AddSeconds(1); //时间增加一秒
61             }
62         }
63     }
64 }

         当午夜时分小偷到达时, sheep 调用 sheep.OnAlarm()函数,从而触发 Alarm 事件,于是系统找到并执行了注册在 Alarm 事件中的事件处理程序 RabbitHandleAlarm()。引发事件的代码
(即 OnAlarm()函数)和事件处理程序是分离的,引发事件的代码只管调用“Alarm()”,而事件处理程序另外独立定义,它们之间通过事件 Alarm 联系起来。 

注意事项

 事件处理程序的参数应该和事件委托相同。一般情况下,事件处理程序接受两个参数,

一个是事件的发送者sender,一个是事件参数e 。

Ending.....

转载于:https://www.cnblogs.com/wozuiaidachengzi/p/7279445.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值