文章目录
1.自定义事件
1.1程序代码
internal class Program
{
static void Main(string[] args)
{
//6.主函数下触发事件
Dog dog = new Dog();
Host host = new Host(dog);
DateTime now = new DateTime(2011,12,31,23,59,50);
DateTime midnight=new DateTime(2012,1,1,0,0,0);
Console.WriteLine("时间一秒一秒的流逝");
while(now<midnight)
{
Console.WriteLine("当前时间:" + now);
System.Threading.Thread.Sleep(1000);//1000ms
now = now.AddSeconds(1);
}
Console.WriteLine("\n月黑风高午夜:" + now);
Console.WriteLine("小偷悄悄的摸进了主人的屋内......");
dog.OnAlarm();
}
}
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());
}
}
}
//4.创建事件的处理程序
class Host
{
void HostHandleAlarm(object sender, EventArgs e)
{
Console.WriteLine("主人:抓住了小偷");
}
//5.注册事件处理程序
public Host(Dog dog)
{
dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}
}
结果:
时间一秒一秒的流逝
当前时间:2011/12/31 23:59:50
当前时间:2011/12/31 23:59:51
当前时间:2011/12/31 23:59:52
当前时间:2011/12/31 23:59:53
当前时间:2011/12/31 23:59:54
当前时间:2011/12/31 23:59:55
当前时间:2011/12/31 23:59:56
当前时间:2011/12/31 23:59:57
当前时间:2011/12/31 23:59:58
当前时间:2011/12/31 23:59:59
月黑风高午夜:2012/1/1 0:00:00
小偷悄悄的摸进了主人的屋内…
小狗报警:汪汪
主人:抓住了小偷
1.2代码解释:
1. 委托声明
在Dog
类中,首先声明了一个名为AlarmEventHandler
的委托。这个委托定义了一个方法签名,该方法接受两个参数:object sender
(事件的发送者)和EventArgs e
(包含事件数据的对象,这里只是简单地使用了EventArgs
的默认实现,没有传递额外的数据)。
public delegate void AlarmEventHandler(object sender, EventArgs e);
2. 事件声明
在Dog
类中,使用前面声明的委托类型声明了一个名为Alarm
的事件。事件是委托类型的特殊封装,它提供了一种发布/订阅模型,允许类或对象提供通知。
public event AlarmEventHandler Alarm;
3. 引发事件的方法
Dog
类中的OnAlarm
方法用于在需要时引发(触发)Alarm
事件。它首先检查是否有任何订阅者(即是否有方法注册到Alarm
事件上),如果有,则调用这些方法。
public void OnAlarm()
{
if(this.Alarm != null)
{
Console.WriteLine( "\n小狗报警:汪汪");
this.Alarm(this, new EventArgs());
}
}
4. 事件处理程序
在Host
类中,定义了一个名为HostHandleAlarm
的方法,该方法符合AlarmEventHandler
委托的签名,因此可以作为Alarm
事件的处理程序。这个方法会在Alarm
事件被触发时执行。
void HostHandleAlarm(object sender, EventArgs e)
{
Console.WriteLine("主人:抓住了小偷");
}
5. 注册事件处理程序
在Host
类的构造函数中,通过+=
操作符将HostHandleAlarm
方法注册为Dog
实例的Alarm
事件的处理程序。这样,当Dog
实例的Alarm
事件被触发时,HostHandleAlarm
方法也会被调用。
public Host(Dog dog)
{
dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}
6. 主函数
在Main
方法中,首先创建了Dog
和Host
的实例,并通过Host
的构造函数将Dog
实例的Alarm
事件与Host
的HostHandleAlarm
方法关联起来。然后,模拟时间流逝,直到午夜,此时调用Dog
的OnAlarm
方法来触发Alarm
事件。由于Alarm
事件已经注册了HostHandleAlarm
作为处理程序,因此会打印出“主人:抓住了小偷”。
while(now<midnight)
{
// ... 时间流逝逻辑
}
dog.OnAlarm(); // 触发事件
2.事件程序中的继承
2.1程序
public class AlarmEventArgs:EventArgs
{
public int numberofThieves;
public AlarmEventArgs(int numberValue)
{
numberofThieves= numberValue;
}
}
internal class Program
{
static void Main(string[] args)
{
//6.主函数下触发事件
Dog dog = new Dog();
Host host = new Host(dog);
DateTime now = new DateTime(2011,12,31,23,59,50);
DateTime midnight=new DateTime(2012,1,1,0,0,0);
Console.WriteLine("时间一秒一秒的流逝");
while(now<midnight)
{
Console.WriteLine("当前时间:" + now);
System.Threading.Thread.Sleep(1000);//1000ms
now = now.AddSeconds(1);
}
Console.WriteLine("\n月黑风高午夜:" + now);
Console.WriteLine("小偷悄悄的摸进了主人的屋内......");
AlarmEventArgs e = new AlarmEventArgs(3);
dog.OnAlarm(e);
}
}
class Dog
{
//1.声明关于事件的委托
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
//2.声明事件
public event AlarmEventHandler Alarm;
//3.编写引发事件的方法
public void OnAlarm(AlarmEventArgs e)
{
if(this.Alarm != null)
{
Console.WriteLine( "\n小狗报警:汪汪");
this.Alarm(this, e);
}
}
}
//4.创建事件的处理程序
class Host
{
void HostHandleAlarm(object sender, AlarmEventArgs e)
{
if (e.numberofThieves<=1)
{
Console.WriteLine("主人:抓住了小偷");
}
else
{
Console.WriteLine("主人:打110报警,我家来了{0}个小偷!", e.numberofThieves);
}
}
//5.注册事件处理程序
public Host(Dog dog)
{
dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}
}
2.2结果:
时间一秒一秒的流逝
当前时间:2011/12/31 23:59:50
当前时间:2011/12/31 23:59:51
当前时间:2011/12/31 23:59:52
当前时间:2011/12/31 23:59:53
当前时间:2011/12/31 23:59:54
当前时间:2011/12/31 23:59:55
当前时间:2011/12/31 23:59:56
当前时间:2011/12/31 23:59:57
当前时间:2011/12/31 23:59:58
当前时间:2011/12/31 23:59:59
月黑风高午夜:2012/1/1 0:00:00
小偷悄悄的摸进了主人的屋内…
小狗报警:汪汪
主人:打110报警,我家来了3个小偷!
2.3代码解释:
AlarmEventArgs
类
这个类继承自 EventArgs
类,用于在事件发生时传递额外的信息。在这个例子中,它传递了一个整数 numberofThieves
,表示检测到的小偷数量。构造函数接受一个整数参数,并将其赋值给 numberofThieves
属性。
Dog
类
- 委托声明:定义了一个名为
AlarmEventHandler
的委托,该委托接受一个对象(事件的发送者)和一个AlarmEventArgs
(包含事件数据的对象)作为参数。 - 事件声明:使用
AlarmEventHandler
委托类型声明了一个名为Alarm
的事件。 - 引发事件的方法:
OnAlarm
方法用于在需要时触发Alarm
事件。它首先检查是否有任何订阅者(即是否有方法注册到Alarm
事件上),如果有,则调用这些方法,并传递Dog
实例本身和AlarmEventArgs
实例作为参数。
Host
类
- 事件处理程序:
HostHandleAlarm
方法是AlarmEventHandler
委托的一个实现,它根据AlarmEventArgs
中的numberofThieves
属性值来决定主人的反应。如果小偷数量小于或等于1,则打印“主人:抓住了小偷”。如果小偷数量大于1,则打印“主人:打110报警,我家来了{0}个小偷!”,其中{0}
会被numberofThieves
的值替换。 - 注册事件处理程序:在
Host
类的构造函数中,通过+=
操作符将HostHandleAlarm
方法注册为Dog
实例的Alarm
事件的处理程序。这样,当Dog
实例的Alarm
事件被触发时,HostHandleAlarm
方法也会被调用。
Program
类
- 主函数:在
Main
方法中,首先创建了Dog
和Host
的实例,并通过Host
的构造函数将Dog
实例的Alarm
事件与Host
的HostHandleAlarm
方法关联起来。然后,模拟时间流逝直到午夜,此时创建一个AlarmEventArgs
实例来表示检测到3个小偷,并调用Dog
的OnAlarm
方法来触发Alarm
事件。由于Alarm
事件已经注册了HostHandleAlarm
作为处理程序,因此会打印出“主人:打110报警,我家来了3个小偷!”。