C#事件-简单实例

委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时委托一个实例和该实例上的一个方法。委托要求添加到委托列表中的所有方法都必须有相同的签名。 事件发行者(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(); } } 运行结果:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值