委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时委托一个实例和该实例上的一个方法。委托要求添加到委托列表中的所有方法都必须有相同的签名。
事件发行者(Publisher):
也称事件发送者(sender),其实就是一个对象,这个对象自行维护本身的状态信息。当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者。
事件订阅者(Subscriber):
对事件感兴趣的对象,也称为接收者(receiver),可以注册感兴趣的事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容。
定义事件的四个步骤
(1)在事件发行者中定义一个事件
(2)在事件发行者中触发事件
(3)在事件订阅者中定义事件处理程序
(4)向事件发行者订阅一个事件
.NET Framework事件设计准则
事件的命名准则应使用PascalCasing命名方式
声明delegate时,使用void类型当作返回值。EventName事件的委托是EventNameEventHandler,事件接受两个传入参数,一律命名为sender与e.(只要使用EventHandler委托,参数就应是object和EventArgs。object是指引发事件的对象;EventHandler是指包含有关事件的其他有用信息的对象。这个对象可以是任意类型,只要它派生于EventArgs即可)
下面以几个例子来说明事件的机制
事件有两个主要的对象
一个发行者 Publisher
一个订阅者 Subscriber
实现步骤:(应用了事件的命名规则)
1、定义一个委托的类型
public delegate void PubLishEventHandler(object sender,EventArgs e);
2、定义一个事件 这个本质就是实现了一个委托链,不过是自动的
public event PublishEventHandler OnPublish;
3、定义事件出发方法
public void issue(object sender,EventArgs e)
{
if(OnPublish!=null)
{
OnPublish(sender,e);
}
}
4、订阅者 接受
public void Reciver(object sender,EventArgs e)
{
}
5、使用
定义发行者
定义订阅者
发行者.OnPublish+=New PulishEventHander(订阅者.Receiver);
发行者.Issue(null,null);
(1)event.cs
using System;
public class Publisher //出版社
{
public delegate void Publish();//声明事件所需的代理
public event Publish OnPublish;//事件的声明
public void issue() //触发事件的方法
{
if (OnPublish != null)
{
Console.WriteLine("发行刊物");
OnPublish();
}
}
}
class Subscriber //订阅者
{
public void Receive() //定义事件处理程序
{
Console.WriteLine("订阅者已经收到了刊物!");
}
}
class story
{
static void Main()
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber();
Pub.OnPublish += new Publisher.Publish(zs.Receive);
Pub.issue(); //触发事件
}
}
运行结果:
event2.cs
using System;
public 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(name + "已经收到" + magazinename);
}
}
class story
{
static void Main()
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber("张三");
Pub.OnPubComputer += new Publisher.PubComputer(zs.Receive);
Subscriber ls = new Subscriber("李四");
Pub.OnPubComputer += new Publisher.PubComputer(ls.Receive);
Pub.OnPubLife += new Publisher.PubLife(ls.Receive);
Pub.issueComputer(); //触发事件
Pub.issueLife();
Console.WriteLine("");
Console.WriteLine("一年后");
Pub.OnPubComputer -= new Publisher.PubComputer(ls.Receive);
Pub.issueComputer(); //触发事件
Pub.issueLife();
Console.WriteLine();
}
}
运行结果:
event3.cs
using System;
public class PubEventArgs : EventArgs
{
private readonly string m_magazineName;
private readonly DateTime m_pubDate;
public PubEventArgs(string magazineName, DateTime pubDate)
{
m_magazineName = magazineName;
m_pubDate = pubDate;
}
public string magazineName
{
get { return m_magazineName; }
}
public DateTime pubDate
{
get { return m_pubDate; }
}
}
public class Publisher //出版社
{
public delegate void PubComputerEventHandler(object sender,PubEventArgs e);//声明事件所需的代理
public delegate void PubLifeEventHandler(object sender, PubEventArgs e);
public event PubComputerEventHandler PubComputer;//事件的声明
public event PubLifeEventHandler PubLife;
protected virtual void OnPubComputer(PubEventArgs e)
{
PubComputerEventHandler handler = PubComputer;
if (handler != null)
{
handler(this, e);
}
}
protected virtual void OnPubLife(PubEventArgs e)
{
PubLifeEventHandler handler = PubLife;
if (handler != null)
{
handler(this, e);
}
}
public void issueComputer(string magazineName,DateTime pubDate) //触发事件的方法
{
Console.WriteLine("发行" + magazineName);
OnPubComputer(new PubEventArgs(magazineName, pubDate));
}
public void issueLife(string magazineName, DateTime pubDate) //触发事件的方法
{
Console.WriteLine("发行" + magazineName);
OnPubLife(new PubEventArgs(magazineName, pubDate));
}
}
class Subscriber //订阅者
{
private string name;
public Subscriber(string name)
{
this.name = name;
}
public void Receive(object sender, PubEventArgs e) //定义事件处理程序
{
Console.WriteLine(e.pubDate + " " + name + "已经收到" + e.magazineName);
}
}
class story
{
static void Main()
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber("张三");
Pub.PubComputer += new Publisher.PubComputerEventHandler(zs.Receive);
Subscriber ls = new Subscriber("李四");
Pub.PubComputer += new Publisher.PubComputerEventHandler(ls.Receive);
Pub.PubLife += new Publisher.PubLifeEventHandler(ls.Receive);
Pub.issueComputer("电脑杂志",Convert.ToDateTime("2006-1-1")); //触发事件
Pub.issueLife("生活杂志", Convert.ToDateTime("2006-1-1"));
Console.WriteLine("***********");
Console.WriteLine("一年后");
Pub.PubComputer -= new Publisher.PubComputerEventHandler(ls.Receive);
Pub.issueComputer("电脑杂志", Convert.ToDateTime("2007-1-1")); //触发事件
Pub.issueLife("生活杂志", Convert.ToDateTime("2007-1-1"));
Console.WriteLine();
}
}
运行结果: