咱們知道要建立一個事件驅動的程序須要下面的步驟:函數
1. 聲明關於事件的委託;post
2. 聲明事件;this
3. 編寫觸發事件的函數;spa
4. 建立事件處理程序;code
5. 註冊事件處理程序;blog
6. 在適當的條件下觸發事件。 事件
如今咱們來編寫一個自定義事件的程序。主人養了一條忠實的看門狗,晚上主人睡覺的時候,狗負責看守房子。一旦有小偷進來,狗就發出一個Alarm事件,主人接到Alarm事件後就會採起相應的行動。假設小偷於2009年元旦午夜時分到達。string
//事件發送者 class Dog { //1.聲明關於事件的委託; public delegate void AlarmEventHandler(object sender, EventArgs e); //2.聲明事件; public event AlarmEventHandler Alarm; //3.編寫引起事件的函數; public void OnAlarm() { if (this.Alarm != null) { Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~"); this.Alarm(this, new EventArgs()); //發出警報 } } } //事件接收者 class Host { //4.編寫事件處理程序 void HostHandleAlarm(object sender, EventArgs e) { Console.WriteLine("主 人: 抓住了小偷!"); } //5.註冊事件處理程序 public Host(Dog dog) { dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm); } } //6.如今來觸發事件 class Program { static void Main(string[] args) { Dog dog = new Dog(); Host host = new Host(dog); //當前時間,從2008年12月31日23:59:50開始計時 DateTime now = new DateTime(2008, 12, 31, 23, 59, 50); DateTime midnight = new DateTime(2009, 1, 1, 0, 0, 0); //等待午夜的到來 Console.WriteLine("時間一秒一秒地流逝... "); while (now < midnight) { Console.WriteLine("當前時間: " + now); System.Threading.Thread.Sleep(1000); //程序暫停一秒 now = now.AddSeconds(1); //時間增長一秒 } //午夜零點小偷到達,看門狗引起Alarm事件 Console.WriteLine("\n月黑風高的午夜: " + now); Console.WriteLine("小偷悄悄地摸進了主人的屋內... "); dog.OnAlarm(); } }
當午夜時分小偷到達時,dog調用dog.OnAlarm()函數,從而觸發Alarm事件,因而系統找到並執行了註冊在Alarm事件中的事件處理程序HostHandleAlarm()。it
事件處理委託習慣上以EventHandler結尾,好比AlarmEventHandler。事件Alarm其實是事件 處理委託AlarmEventHandler的一個實例。引起事件的代碼經常被編寫成一個函數,.NET約定這種函數的名稱爲 「OnEventName」,好比OnAlarm()的函數。在Host類中,咱們定義了事件處理程序HostHandleAlarm(),並把它註冊到 dog.Alarm事件中。event
事件處理程序的參數應該和事件委託相同。通常狀況下,事件處理程序接受兩個參數,一個是事件的發送者sender,一個是事件參數e[①]。事件參數用於在發送者和接收者之間傳遞信息。