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
    {
        //执行-=运算符的代码
    }
}

 

posted @ 2017-12-25 16:51  养鼠的猫  阅读(177)  评论(0编辑  收藏  举报