16.4.2自定義事件
通過上一節的論述,我們知道要創建一個事件驅動的程序需要下面的步 驟:
1.聲明關於事件的委托;
2.聲明事件;
3.編寫觸發事件的函數;
4.創建事 件處理程序;
5.注冊事件處理程序;
6.在適當的條件下觸發事件.
現在我們來編寫一 個自定義事件的程序.主人養了一條忠實的看門狗,晚上主人睡覺的時候,狗負責看守房子.一旦有小偷進來 ,狗就發出一個Alarm事件,主人接到Alarm事件後就會采取相應的行動.假設小偷於2009年元旦午夜時分到 達.
作者:梁斌玉 摘自《C#初學課堂》
本章目錄
第16章 委托與事件
16.1委 托
16.2多播委托
16.3匿名函數
16.4事件處理機制
16.4.1事件處理機制的原 理
16.4.2自定義事件
試一試:自定義事件
//事件發送者
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("當前
當午夜時分小偷到達時,dog調用 dog.OnAlarm()函數,從而觸發Alarm事件,於是系統找到並執行了注冊在Alarm事件中的事件處理程序 HostHandleAlarm().
事件處理委托習慣上 以EventHandler結尾,比如AlarmEventHandler。事件Alarm實際上是事件處理委托AlarmEventHandler的 一個實例。引發事件的代碼常常被編寫成一個函數,.NET約定這種函數的名稱為 “OnEventName”,比如OnAlarm()的函數。在Host類中,我們定義了事件處理程序 HostHandleAlarm(),並把它注冊到dog.Alarm事件中。
事件處理程序的參數 應該和事件委托相同。一般情況下,事件處理程序接受兩個參數,一個是事件的發送者sender,一個是事 件參數e[①]。事件參數用於在發送者和接收者之間傳遞信息。
.NET提供了100個事件 參數類,這些都繼承於EventArgs類.一般情況下,使用.NET自帶的類足夠了,但為了說明原理,我們自定義一 個事件參數類.
試一試:使用事件參數
//事件參數
public class NumberOfThiefEventArgs : EventArgs
{
public int numberOfThief;
//構造函數
public NumberOfThiefEventArgs(int number)
{
numberOfThief = number;
}
}
//事 件發送者
class Dog
{
//1.聲明關於事件的委托;
public delegate void AlarmEventHandler(object sender, NumberOfThiefEventArgs e);
//2. 聲明事件;
public event AlarmEventHandler Alarm;
//3.編寫引發事件的 函數,注意多了個參數;
public void OnAlarm(NumberOfThiefEventArgs e)
{
if(this.Alarm != null)
{
Console.WriteLine("\n狗報警: 有小偷進來了,汪汪~~~~~~~\n");
this.Alarm(this, e);
}
}
}
//事件接收者
class Host
{
//4.編寫事件處理程序,參數中包 含著numberOfThief信息
void HostHandleAlarm(object sender, NumberOfThiefEventArgs e)
{
if (e.numberOfThief <= 1)
{
Console.WriteLine("主 人: 抓住了小偷!");
}
else
{
Console.WriteLine("主 人:打110報警 ,我家來了{0}個小偷!", e.numberOfThief);
}
}
//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("當 前