委托 事件 实例代码演示

/*
 * By:.NET 钉子户
 * Date: 2009-2-16
 * Time: 10:47
 */
using System;

//定义一个提供事件数据的类 ,以EventNameEventArgs格式进行命名
class PubEventArgs : EventArgs
{
 private readonly string _magazineName;
 private readonly DateTime _pubDateTime;
 public PubEventArgs(string magazineName,DateTime pubDateTime)
 {
  _magazineName=magazineName;
  _pubDateTime=pubDateTime;
 }
 
 public string MagzineName
 {
  get{return _magazineName;}
 }
 public DateTime PubDateTime
 {
  get{ return _pubDateTime;}
 }
}
class Publisher
{
 public delegate void PubCompanyEventHandle(object sender,PubEventArgs e);
 public delegate void PubLifeEventHandle(object sender,PubEventArgs e);
 public event PubCompanyEventHandle PubCompany;
 public event PubLifeEventHandle PubLife;
 protected virtual void OnPubCompany(PubEventArgs e)
 {
  PubCompanyEventHandle handle=PubCompany;//为什么要声明一个临时事件变量呢?这样做主要是为了防止线程同步问题
  if(handle!=null)
  {
   handle(this,e);
   
  }
 }
 protected virtual void OnPubLife(PubEventArgs e)
 {
  PubLifeEventHandle handle=PubLife;
  if(handle!=null)
  {
   handle(this,e);
  }
 }
 public void IssueCompany(string magazineName,DateTime pubDateTime)//注意些处的参数,不用与委托签名一致
 {
  Console.WriteLine("发行"+magazineName);
  OnPubCompany(new PubEventArgs(magazineName,pubDateTime));//调用用OnPubCompany方法
  
 }
 public void IssueLife(string magazineName,DateTime pubDateTime)//注意些处的参数,不用与委托签名一致
 {
  Console.WriteLine("发行"+magazineName);
  OnPubLife(new PubEventArgs(magazineName,pubDateTime));//调用用OnPubCompany方法
  
 }
 
}

class Subscribe
{
 private string _name;
 public Subscribe (string name)
 {
  _name=name;
 }
 public void Receive(object sender,PubEventArgs e)
 {
  Console.WriteLine(e.PubDateTime+_name+"已经收到"+e.MagzineName);
 }
}
class story
{
 static void Main()
 {
  Publisher pub=new Publisher();
  Subscribe zs=new Subscribe("张三");
  Subscribe ls=new Subscribe("李四");
  pub.PubCompany +=new Publisher.PubCompanyEventHandle(zs.Receive);
  pub.PubCompany += new Publisher.PubCompanyEventHandle(ls.Receive);
  pub.PubLife += new Publisher.PubLifeEventHandle(ls.Receive);
  pub.IssueCompany("电脑杂志",Convert.ToDateTime("2009-02-16"));
  pub.IssueLife("生活杂志", Convert.ToDateTime("2009-02-16"));
  Console.WriteLine();
  
  Console.WriteLine("一年之后");
  pub.PubCompany -= new Publisher.PubCompanyEventHandle(ls.Receive);
  pub.IssueCompany("电脑杂志",Convert.ToDateTime("2010-02-16"));
  pub.IssueLife("生活杂志",Convert.ToDateTime("2010-02-16"));  
  
 }
}

posted @ 2009-02-17 09:15  .NET钉子户  阅读(283)  评论(0)    收藏  举报