C#学习笔记之——事件(Event)
发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。
事件处理程序(event handler)由订阅者注册到事件的方法,在发布者触发事件时执行。
触发(raise)事件 调用(invoke)或者触发(fire)事件的术语。当事件触发时,所有注册到它的方法都会依次调用。
声明事件的委托类型
public delegate void BoilerLogHandler(string status);
声明事件本身
// 基于上面的委托定义事件
public event BoilerLogHandler BoilerEventLog;
例子:
热水器类
public delegate void WatchdogDelegate();//委托类型声明
/// <summary>
/// 热水器类Water heater.
/// </summary>
public class WaterHeater
{
public event WatchdogDelegate watchdogDelegateEvent;//事件声明
private int temperature = 3;//基础温度
public void HeatUpWater()
{
while (temperature < 95)
{
//不动3s 需要System.Threading
Thread.Sleep(2000);
temperature += 10;
Console.WriteLine("Temperature:{0}", temperature);
}
watchdogDelegateEvent();
}
}
警报器类
public class Annunciator
{
public void Alert()
{
Console.WriteLine("!!!!!!!!!");
}
}
显示器类
public class Display
{
public void Show ()
{
Console.WriteLine ("It is over 95°");
}
}
//建立对象
WaterHeater waterHeater = new WaterHeater();
Display display = new Display();
Annunciator annunciator = new Annunciator();
//添加方法
waterHeater.watchdogDelegateEvent += display.Show;
waterHeater.watchdogDelegateEvent += annunciator.Alert;
waterHeater.HeatUpWater();
结果:
Temperature:13 Temperature:23 Temperature:33 Temperature:43 Temperature:53 Temperature:63 Temperature:73 Temperature:83 Temperature:93 Temperature:103 It is over 95° !!!!!!!!! |
移除事件 -=,添加事件 +=
事件访问器
public event EventHandler CountedADozen
{
add
{
//执行+=运算符的代码
}
remove
{
//执行-=运算符的代码
}
}