您的位置:首页 > 职场人生

《程序员的第一年》---------- c#自定义事件机制源码说明

2013-07-20 16:57 211 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

//谈到事件,我们涉及到两个角色:事件发布者(Publisher)和事件订阅者(Scriber),
//也可以说是事件发送者(Sender)和事件接收者(Receiver)的关系。举个例子来说,
//市面上目前有许多杂志,杂志的种类也很多。而我只对其中的某些感兴趣,
//那么我就可以向杂志发行商提出订阅。之后,每当杂志发行时,
//我就会收到我在杂志发行商那儿订阅的杂志。在这个关系中,
//杂志发行商就相当于事件发行者,而我就是事件订阅者。
//每当杂志发行时,就触发了一个发行事件。
//用面向对象的语言解释,这两者的意义如下:

//事件发行者(Publisher)
//它是一个对象,且会维护自身的状态信息。每当状态信息发生变动时,
//便触发一个事件,并通知所有的事件订阅者。对于杂志发行商来说,
//每本杂志都有自己的信息在里面,当杂志发行时,我要通知订阅该杂志的人:
//杂志已经发行啦,请注意查收!

//事件接收者(Receiver)
//这个对象要注册它感兴趣的对象,也就是订阅它自己喜欢的杂志啦。另外,
//这个对象通常要提供一个事件处理方法,在事件发行者触发一个事件后,
//会自动执行这个方法。对于上面所举的例子来说,也就是我收到杂志后要做什么事情,
//比如,你可以满世界地大喊:我收到杂志啦!也可以将杂志收藏起来慢慢欣赏,
//具体怎么实现完全取决你自己的喜好。

namespace 自定义事件
{
//声明一个代理类
public delegate void SalaryCompute(object sender, MyEventArgs e);
//事件发布者(Publisher)
public class Event
{
//定义事件,将其与代理绑定
public event SalaryCompute OnSalaryCompute;

//触发事件的方法
public virtual void FireEvent(MyEventArgs e)
{
if (OnSalaryCompute != null)
{
//触发事件 -------相当发新杂志
OnSalaryCompute(this, e);

}

}

}

//定义事件参数类
public class MyEventArgs : EventArgs
{
public readonly double _salary;
public MyEventArgs(double salary)
{
this._salary = salary;
}
}

//--------------------------
//事件接收者(Receiver)
public class Program
{
//事件处理函数,其签名应与代码签名相同-------相当回应(我收到杂志啦)
public void SalaryHandler(object sender,MyEventArgs e)
{
Console.WriteLine("Salary:{0}",e._salary);
Console.Read();
}
static void Main(string[] args)
{
Event et = new Event();//定义发布者
Program pm = new Program();//定义订阅者
MyEventArgs e = new MyEventArgs(123.14);//定义事件-----比如:发行杂志
et.OnSalaryCompute += new SalaryCompute(pm.SalaryHandler);  //注册-----订阅者订阅杂志

for ( ;  ;  )
{
Thread.Sleep(1000);
et.FireEvent(e);//触发事件 -----发布者发行杂志,订阅者触发SalaryHandler方法回应(我收到杂志啦)
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: