.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.在事件符合條件時,調用事件
結果: