.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());
}
此處的主要作用是實現了:
事件應該由事件的發佈者觸發