.net 委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其一
.net 委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其二
.net 委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其三
事件
事件基于委托,为委托提供了一种发布/订阅机制(观察者模式)
事件必须包含三部分:
事件的订阅者
事件的触发者/发布者
订阅者和触发者之间的数据传输通道
事件(event)的本质:事件本身其实就是一个委托链
问题:猫叫了一声,老鼠们跑了,主人醒了
事件初探
订阅者
用于在事件触发后,做出对应的响应行为
此处传入的ifCatMiao就是事件的结果,WakeUp就是响应行为
/// <summary>
/// 订阅者 老鼠
/// </summary>
public class Master
{
public void WakeUp(bool ifCatMiao)
{
System.Diagnostics.Debug.WriteLine("主人醒了");
}
}
/// <summary>
/// 订阅者 主人
/// </summary>
public class Mouse
{
public void RunAway(bool ifCatMiao)
{
System.Diagnostics.Debug.WriteLine("老鼠跑");
}
}
发布者
此处发布者只是做了对应的事件
/// <summary>
/// 普通猫,把要干的事情放在主程序上,Index
/// </summary>
public class Cat
{
public bool Miao()
{
System.Diagnostics.Debug.WriteLine("猫叫了");
return true;
}
}
通道
public class CatEventController : Controller
{
//此处委托的标签(传参和回参)与订阅者的标签必须一致
public delegate void IfMiaoHandler(bool ifCatMiao);
public static event IfMiaoHandler IfMiao;
public void Index()
{
var mouses = new List<Mouse>() { new Mouse(), new Mouse(), new Mouse() };
var master = new Master();
var cat = new Cat();
//添加老鼠的逃跑
foreach (var mouse in mouses)
{
IfMiao += mouse.RunAway;
}
//添加主任的惊醒
IfMiao += master.WakeUp;
//激发事件
IfMiao(new Cat().Miao());
}
由以上代码可知,使用事件的步骤需要
1.声明订阅者
2.声明发布者
3.声明委托及事件(事件基于委托)
4.为事件增加订阅者
5.在事件符合条件时,调用事件
结果: