關於“事件”的定義,請去問Google吧,本文不引用官方的術語。
廢話不多說,先定義一下場景:
微波爐,大家生活中都有用過,當你關上微波爐的門時便自動加熱。“關門”和“加熱”便是兩個動作。注意,當關上門的時候便開始加熱,這里“當關上門”便是一個“事件”的觸發條件。觸發了什么?“加熱”這個動作。
我相信你完全能理解我上面所說的內容吧?那么接下來我便一步一步來實現我的題目“C#事件Event”
第一步:定義我們的對象
對象一:微波爐
/// <summary> /// 微波爐 /// </summary> class Microwave { }
對象二:加熱器(微波爐內置)
/// <summary> /// 加熱器 /// </summary> class Heater { }
第二步:添加動作(或稱行為)
我們提過的,“關門” 和 “加熱” 兩個動作
/// <summary> /// 微波爐 /// </summary> class Microwave { /// <summary> /// 關門 /// </summary> public void CloseDoor() { Console.WriteLine("Now the door is closed!"); } } /// <summary> /// 加熱器 /// </summary> class Heater { /// <summary> /// 加熱 /// </summary> public void Heating() { Console.WriteLine("The food is heating!"); Console.ReadLine(); } }
第三步:定義我們的“事件”(出場)
/// <summary> /// 微波爐 /// </summary> class Microwave {
public delegate void DoorCloseHandler(); public event DoorCloseHandler DoorCloseEvent; /// <summary> /// 關門 /// </summary> public void CloseDoor() { Console.WriteLine("Now the door is closed!"); } }
這里我們給“門”定義“關閉”事件,也就是下面那兩句:
public delegate void DoorCloseHandler(); public event DoorCloseHandler DoorCloseEvent;
“事件”有了,什么時候執行呢?當然是“關上門”后執行了。
/// <summary> /// 微波爐 /// </summary> class Microwave { public delegate void DoorCloseHandler(); public event DoorCloseHandler DoorCloseEvent; /// <summary> /// 關門 /// </summary> public void CloseDoor() { Console.WriteLine("Now the door is closed!"); OnDoorClosed(); } public void OnDoorClosed() { if (DoorCloseEvent != null) DoorCloseEvent(); } }
看到了嗎?在我們之前定義的 CloseDoor 方法后面調用我們的“事件”。
到這里為止,我們知道了事件的“發起者”(關門動作),事件的“要做什么”(加熱),事件“什么時候執行”(關上門),還缺點什么呢?
串起來嘍,也就是俗稱的“綁定”它。
/// <summary> /// 微波爐 /// </summary> class Microwave { public delegate void DoorCloseHandler(); public event DoorCloseHandler DoorCloseEvent; /// <summary> /// 關門 /// </summary> public void CloseDoor() { Console.WriteLine("Now the door is closed!"); OnDoorClosed(); } public void OnDoorClosed() { if (DoorCloseEvent != null) DoorCloseEvent(); } public Microwave() { Heater heater = new Heater(); this.DoorCloseEvent += heater.Heating; } }
我選擇了在廠家生產微波爐的時候就把他們綁起來(我是想說構造函數來着),不是這樣,我不會買這微波爐的,你呢?
大功告成,讓我們“關門”試試吧!
class Program { static void Main(string[] args) { Microwave wave = new Microwave(); wave.CloseDoor(); } }
最后附上完整代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Event { class Program { static void Main(string[] args) { Microwave wave = new Microwave(); wave.CloseDoor(); } } /// <summary> /// 微波爐 /// </summary> class Microwave { public delegate void DoorCloseHandler(); public event DoorCloseHandler DoorCloseEvent; /// <summary> /// 關門 /// </summary> public void CloseDoor() { Console.WriteLine("Now the door is closed!"); OnDoorClosed(); } public void OnDoorClosed() { if (DoorCloseEvent != null) DoorCloseEvent(); } public Microwave() { Heater heater = new Heater(); this.DoorCloseEvent += heater.Heating; } } /// <summary> /// 加熱器 /// </summary> class Heater { /// <summary> /// 加熱 /// </summary> public void Heating() { Console.WriteLine("The food is heating!"); Console.ReadLine(); } } }
希望能對你對事件的理解和使用有所幫助,謝謝!
開博之作,轉載麻煩注明原創作者,謝謝。期待下一篇吧:)
