- 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。
- 事件是一种特殊的委托。
- 委托类似于 C++ 函数指针,但它们是类型安全的
为什么要使用事件
首先我们来讨论一个问题,给你一个变量CurSeason,当CurSeason=Spring,输出花盛开,蜜蜂采蜜,当CurSeason的值改变时输出别的,部分同学可能会觉得很简单,直接就给出了代码
if(CurSeason==Spring)
{
Console.WriteLine("花盛开,蜜蜂采蜜");
}
else if(CurSeason==Summer)
{
Console.WriteLine("花成长,蜜蜂躲起来");
}
else if(CurSeason==Autumn)
{
Console.WriteLine("花成长,蜜蜂躲起来");
}
else if(CurSeason==Winter)
{
Console.WriteLine("花凋谢,蜜蜂躲起来");
}
那么这段代码应该写到哪去呢,添加到一个循环里面让它每帧都执行这个判断?况且后面CurSeason假如有别的情况,扩展起来相对麻烦
这时候我们便可以引入事件机制
使用事件的好处
使用事件,我们可以轻易实现事件驱动的程序方式,大大降低类之间的耦合程度。
使用步骤
- delegate声明:public delegate void DoPosChanged(int x);
- event声明:public event DoPosChanged OnPosChanged
- 绑定事件:(+操作)
- 触发事件
- 取消订阅:(-操作)
完整代码
using System;
public enum Season
{
Spring = 1,
Summer,
Autumn,
Winter
}
//delegate声明
public delegate void OnSeasonChanged(Season s);
public class CWeather
{
Season m_curSeason;
//event声明
public event OnSeasonChanged SeasonChanged;
public Season CurSeason
{
get { return m_curSeason; }
set
{
if (value != null && m_curSeason != value)
{
m_curSeason = value;
SeasonChanged(value);
}
}
}
}
public class CFlower
{
//构造函数
public CFlower(CWeather weather)
{
weather.SeasonChanged += OnEnterSeason;//添加事件监听
}
public void OnEnterSeason(Season s)
{
switch (s)
{
case Season.Spring:
System.Console.WriteLine("花--盛开!");
break;
case Season.Winter:
System.Console.WriteLine("花--凋谢");
break;
default:
System.Console.WriteLine("花--成长!");
break;
}
}
}
public class CBee
{
//构造函数
public CBee(CWeather weather)
{
weather.SeasonChanged += OnEnterSeason;//添加事件监听
}
public void OnEnterSeason(Season s)
{
switch (s)
{
case Season.Spring:
System.Console.WriteLine("蜜蜂--采蜜");
break;
default:
System.Console.WriteLine("蜜蜂躲起来");
break;
}
}
}
class Program
{
static void Main(string[] args)
{
CWeather w = new CWeather();
CFlower f = new CFlower(w);
CBee b = new CBee(w);
Console.WriteLine("===={0}====", Season.Spring);
w.CurSeason = Season.Spring;
Console.WriteLine("===={0}====", Season.Summer);
w.CurSeason = Season.Summer;
Console.WriteLine("===={0}====", Season.Autumn);
w.CurSeason = Season.Autumn;
Console.WriteLine("===={0}====", Season.Winter);
w.CurSeason = Season.Winter;
Console.ReadLine();
}
}
阅读以上代码,是不是觉得事件使用起来特方便,只需在扩展的类中使用”+操作“添加一个事件监听,当CurSeason改变的时候它便会立马通知里,这时候你不需要去写声明if判断,不需要去关心CurSeason什么时候会改变,大大降低类之间的耦合程度。