[叩响C#之门]写给初学者:自定义事件
2010-09-30 20:56:35 来源:WEB开发网当午夜时分小偷到达时,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("当前时间: " + now);
System.Threading.Thread.Sleep(1000); //程序暂停一秒
now = now.AddSeconds(1); //时间增加一秒
}
//午夜零点小偷到达,看门狗引发Alarm事件
Console.WriteLine("\n月黑风高的午夜: " + now);
Console.WriteLine("小偷悄悄地摸进了主人的屋内... ");
//创建事件参数
NumberOfThiefEventArgs e = new NumberOfThiefEventArgs(3);
dog.OnAlarm(e);
}
}
运行结果如下:
在修改过的代码中,我们定义了一个名为NumberOfThiefEventArgs的事件参数类,它继承于EventArgs类。在该类中我们声明了一个名为numberOfThief的成员变量,用来记录来了几个小偷。当事件发生时,狗通过事件参数传告诉主人具体信息。
[①] C#语言并不强制使用这种形式,在自定义的事件中可以使用其他参数类型。
- ››初学者对于三层框架的理解
- ››写给初学者:多线程系列( 十)——死锁(Deadlock)...
- ››写给初学者:多线程系列( 十一)——线程池(Thread...
- ››写给初学者:多线程系列(一)——线程的概念
- ››写给初学者:多线程系列(二)—— Thread类(线程类...
- ››写给初学者:多线程系列(三)——线程的优先级
- ››写给初学者:多线程系列(四)——线程的插入 Join(...
- ››写给初学者:多线程系列(五)——线程的状态
- ››写给初学者:多线程系列(六)——线程同步的概念
- ››写给初学者:多线程系列(七)——互锁(Interlocke...
- ››写给初学者:多线程系列(八)——管程类(Monitor类...
- ››写给初学者:多线程系列( 九)——互斥体(Mutex类...
更多精彩
赞助商链接