1. 定义及使用事件
- 事件与委托很相似,下面具体学习一下。
1.1 公用部分
- ① 声明委托
delegate void EventHandler(obj, args );
1.2 事件拥有类
- ② 定义事件发布类,又叫事件拥有类
public class EventPublisher { }
- ③ 声明事件
public event EventHanler Event;
- ④ 调用事件的方法
public <返回类型> OnEvent(参数列表)
{
statements;
this.Event;
}
1.3 事假订阅类
- ⑤ 定义事件触发时的处理方法
<访问修饰符> <返回类型> <方法名>(obj, args)
- ⑥ 订阅事件,又叫注册事件
xxx.事件 += new EventHandler(<方法名>);
2. 举例说明
using System;
// 1.声明事件的委托
public delegate void OlympicsOpenHandler();
// 2. 定义事件(发布)拥有类
public class TimeCountDown
{
// 3. 声明事件
public event OlympicsOpenHandler OlympicsOpen;
// 4. 触发事件的方法
public void OnTimeCountDown()
{
Console.WriteLine("倒计时结束! ");
Console.WriteLine("=======================================");
this.OlympicsOpen();
}
}
// 定义事件订阅类
public class Hostess
{
// 5. 事件触发后的处理方法
public void AnnounceOpen()
{
Console.WriteLine("现在我宣布,2020 年东京奥运会正式开幕!");
}
// 6. 订阅事件
public Hostess(TimeCountDown timeCountDown)
{
timeCountDown.OlympicsOpen += new OlympicsOpenHandler(AnnounceOpen);
}
}
public class TestOpen
{
static void Main(string[] args)
{
// 实例化对象:事件拥有者对象和事件订阅者对象
TimeCountDown timeCountDown = new TimeCountDown();
Hostess DongQing = new Hostess(timeCountDown);
// 开始倒计时
DateTime now = new DateTime(2020, 07, 24, 19, 59, 55);
DateTime end = new DateTime(2020, 07, 24, 20, 0, 0);
while (now <= end)
{
Console.WriteLine(now.ToString());
System.Threading.Thread.Sleep(1000);
now = now.AddSeconds(1);
}
// 倒计时结束,触发事件:OlympicsOpen
timeCountDown.OnTimeCountDown();
Console.ReadKey();
}
}
3. 小结
3.1 事件三要素
事件拥有者:也叫事件发布者,个人觉得用拥有者更方便理解,很显然,谁定义事件谁就是事件的拥有者。具体到代码中也就是哪个类中定义了的事件,那么这个类的实例就是事件的拥有者。
事件订阅者:可理解为“盯着”事件拥有者的某个行为的对象,在代码中可通过构造函数来实现事件订阅类和事件拥有类的关联。
事件处理方法:事件触发后要执行的方法。当事件订阅者“发现”事件拥有者的事件被触发时,事件订阅者需要去执行的方法。在代码中,事件处理方法是定义在事件订阅类中。
3.2 事件和委托
- 事件 event 和委托 delegate 的关系就像字段和属性的关系;
- 事件 event 会限制委托 delegate 不能直接进行赋值操作,防止将委托替换掉,只能通过 += 和 -= 来绑定或者解除绑定;
- 事件 event 还限定了委托 delegate 只能在定义的类中被调用。