“----------ASP.Net+Android+IOS开发、Net培训、期待与您交流!----------”
事件是类在发生其关注的事情时用来通知的一种方式,例如:封装用户界面的类可以定义一个在用户单击该控件时发生的事件,控件类不关心单击按钮时发生了什么
但它需要告知派生类单击事件已经发生.然后,派生类可选择如何响应
事件发行者(Publisher):
一个事件发行者,也称作发送者(sender),其实就是一个对象,这个对象会自行维护本身的状态信息,当本身状态信息发生变动时,便触发一个事件
并通知所有事件订阅者
事件订阅者(Subscriber):
对事件感兴趣的对象,也称为接收者(Receiver),可以注册感兴趣的事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容
事件的四个步骤:
1.在事件发行者中定义一个事件
2.在事件发行者中触发事件
3.在事件订阅者中定义事件处理程序
4.向事件发行者中订阅一个事件
class ClassEvent
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber zs = new Subscriber("张三");
publisher.onPubComputer += new Publisher.PubComputer(zs.Receive);//向事件发行者订阅一个事件(委托类型是静态方法,事件是实例方法)
Subscriber ls = new Subscriber("李四");
publisher.onPubComputer += new Publisher.PubComputer(ls.Receive);
publisher.onPubLife += new Publisher.PubLife(ls.Receive);
publisher.IssueComputer();//触发事件
publisher.IssueLife();
Console.WriteLine();
Console.WriteLine("一年后,李四取消了对《电脑》杂志的订阅");
Console.WriteLine();
publisher.onPubComputer -= new Publisher.PubComputer(ls.Receive);
publisher.IssueComputer();//触发事件
publisher.IssueLife();
Console.ReadLine();
}
}
//出版社现在出版两本杂志(电脑,生活)
class Publisher //出版社
{
public delegate void PubComputer(string magazineName); //声明事件所需的代理(个人理解:事件订阅者方法类型(无参无返回值))
public delegate void PubLife(string magazineName);
public event PubComputer onPubComputer; //事件的声明(事件无返回值,若有,就失去了意义(+=))
public event PubLife onPubLife;
public void IssueComputer()
{ //触发事件的方法
if (onPubComputer != null)
{
Console.WriteLine("出版社发行《电脑》杂志");
onPubComputer("电脑杂志");
}
}
public void IssueLife()
{ //触发事件的方法
if (onPubLife != null)
{
Console.WriteLine("出版社发行《生活》杂志");
onPubLife("生活杂志");
}
}
}
class Subscriber //订阅者
{
private string name;
public Subscriber(string name) {
this.name = name;
}
public void Receive(string magazineName)
{ //在事件订阅者中定义事件处理程序(与发行者中声明的委托类型一致)
Console.WriteLine(this.name + "已经收到" + magazineName);
}
}