.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>
/// 发布者猫,把事件放在发布者猫内部,并提供执行语句
/// 重要:事件应该由事件的发布者触发
/// </summary>
public class Cat2
{
public delegate void IfMiaoHandler(bool bol);
public static event IfMiaoHandler IfMiao;
public static bool Miao()
{
//var ifMiao = (new Random()).Next(0, 1)==1;
//if (ifMiao)
//{
// System.Diagnostics.Debug.WriteLine("猫叫了");
//}else
//{
// System.Diagnostics.Debug.WriteLine("猫睡着了");
//}
System.Diagnostics.Debug.WriteLine("猫叫了");
return true;
}
public static void Excute(bool bol)
{
//事件在对象之内
IfMiao(bol);
}
}
管道:
public void Second()
{
var mouses = new List<Mouse>() { new Mouse(), new Mouse(), new Mouse() };
var master = new Master();
//添加老鼠的逃跑
foreach (var mouse in mouses)
{
Cat2.IfMiao += mouse.RunAway;
}
//添加主任的惊醒
Cat2.IfMiao += master.WakeUp;
//直接激发事件或报错,在事件所处的对象之外,事件只能出现在+=,-=之外
//Cat2.IfMiao(Cat2.Miao());
Cat2.Excute(Cat2.Miao());
}
此处的主要作用是实现了:
事件应该由事件的发布者触发