本篇文章我们来讨论C#中的事件。委托是事件的基础,了解委托请点击C#委托 。
我们先来看下面这个类
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void ZhuangBi()
{
string topic="I am newbility";
Console.WriteLine(topic);
}
}
这个Person类有一个ZhuangBi方法,大家都知道,一个人关起门来装逼太没意思,所以我们希望在执行ZhuangBi方法时通知感兴趣的人,让他们知道我们在装逼。问题是怎么通知感兴趣的人呢?观察者模式可以将感兴趣的人抽象为接口,在Person类内部维护一个接口集合,在执行ZhuangBi方法时可以通知到所有感兴趣的人,可这不在我们讨论的范围内。这次我们通过C#的事件机制来实现对外界发出通知。
想用事件,必须先有委托,我们来定义一个委托
public delegate void ZhuangBi_Handler(string name, string topic);
有了委托之后,我们来改写Person类
public class Person
{
public Person(string name)
{
this.Name = name;
}
public string Name { get; set; }
public int Age { get; set; }
public event ZhuangBi_Handler ZhuangBi_Completed;
public void ZhuangBi()
{
string topic = "I am newbility";
Console.WriteLine(topic);
if (ZhuangBi_Completed != null)
{
ZhuangBi_Completed(Name, topic);
}
}
}
我们定义了一个ZhuangBi_Handler 类型的事件 ZhuangBi_Completed,在装逼完成后,我们来对外界发出通知。
下面我们编写一个类,来注册(或者叫订阅)这个事件。我们写一个粉丝类
public class Funs
{
static void Main(string[] args)
{
Person person = new Person("kai_ge");
person.ZhuangBi_Completed += person_ZhuangBi_Completed;
person.ZhuangBi();
}
private static void person_ZhuangBi_Completed(string name, string topic)
{
Console.WriteLine("哇,{0}又开始装逼了,他说:{1}", name, topic);
}
}
我们在类内部定义一个事件对象,可以被很多对象注册。当类的内部发生特定的行为时,我们在类内部可以向所有外部的注册者发送通知。
我们的这个类是如此的成功,在社会上产生了巨大的影响,也包括下面这个类
public class PoliceMan
{
static void Main(string[] args)
{
Person person = new Person("kai_ge");
person.ZhuangBi_Completed += person_ZhuangBi_Completed;
person.ZhuangBi();
}
static void person_ZhuangBi_Completed(string name, string topic)
{
Console.WriteLine(name + ",我们怀疑你跟一起装逼案有关,请跟我们到警局接受调查,证据为:" + topic);
}
}
备注:
1. 两个注册者都在Main函数中定义,如果你把代码复制到本地编译,两个注册者不能同时编译,你可以把一个注释掉。我之所以这么写,是为了降低订阅类的复杂性,否则又得定义一大堆类,这样我们的主题就跑偏了。
2. 装逼有风险,雨天要谨慎。
原文地址:http://blog.csdn.net/daguanjia11/article/details/45092847