关于C#事件

  1/*
  2 * 该程序是介绍关于事件的处理过程,使用c#提供的规范化模式
  3 * 出版社和订阅者的模式,出版社要定义事件,订阅者来定义响应事件函数
  4 * 
  5 */

  6using System;
  7using System.Collections.Generic;
  8using System.Text;
  9
 10class PubEventArgs : EventArgs      //事件传递参数类
 11{
 12    private readonly string m_magazineName;
 13    private readonly DateTime m_pubDate;
 14    public PubEventArgs(string magazineName, DateTime pubDate) 
 15    {
 16        m_magazineName = magazineName;
 17        m_pubDate = pubDate;
 18    }

 19    public string magazineName 
 20    {
 21        get return m_magazineName; }
 22    }

 23    public DateTime pubDate 
 24    {
 25        get return m_pubDate; }
 26    }

 27}

 28
 29class Publisher 
 30{
 31    public delegate void PubComputerEventHandler(object sender, PubEventArgs e); //定义事件委托
 32    public delegate void PubLifeEventHandler(object sender, PubEventArgs e);
 33    public event PubComputerEventHandler PubComputer;
 34    public event PubLifeEventHandler PubLife;   //根据委托类型定义事件
 35    protected virtual void OnPubComputer(PubEventArgs e) /*触发事件*/
 36    {
 37        PubComputerEventHandler handler = PubComputer;
 38        if (handler != null)
 39        {
 40            /*实际上触发的是这个委托链*/
 41            handler(this, e);
 42        }

 43    }

 44    protected virtual void OnPubLife(PubEventArgs e) 
 45    {
 46        PubLifeEventHandler handler = PubLife;
 47        if (handler != null
 48        {
 49            handler(this, e);
 50        }

 51    }

 52    public void issueComputer(string magazineName, DateTime pubDate) //触发方法
 53    {
 54        Console.WriteLine("发行"+magazineName);
 55        OnPubComputer(new PubEventArgs(magazineName,pubDate));
 56    }

 57    public void issueLife(string magazineName, DateTime pubDate)
 58    {
 59        Console.WriteLine("发行"+magazineName);
 60        OnPubLife(new PubEventArgs(magazineName, pubDate));
 61    }

 62}

 63
 64class Subscriber 
 65{
 66    private string name;
 67    public Subscriber(string name) 
 68    {
 69        this.name = name;
 70    }

 71    public void Receive(object sender ,PubEventArgs e)
 72    {
 73        Console.WriteLine(e.pubDate+" "+name+"已经收到"+e.magazineName);
 74    }

 75}

 76
 77namespace CSEventTestProc
 78{
 79    class Program
 80    {
 81        static void Main(string[] args)
 82        {
 83            Publisher pub = new Publisher();
 84            Subscriber zs = new Subscriber("张三");
 85            Subscriber ls = new Subscriber("李四");
 86            pub.PubComputer += new Publisher.PubComputerEventHandler(zs.Receive);
 87            pub.PubComputer += new Publisher.PubComputerEventHandler(ls.Receive);
 88            pub.PubLife += new Publisher.PubLifeEventHandler(ls.Receive);
 89
 90            pub.issueComputer("电脑杂志", Convert.ToDateTime("2010-12-24"));
 91            pub.issueLife("生活杂志", Convert.ToDateTime("2010-12-24"));
 92
 93            Console.WriteLine("一年后……");
 94            pub.PubComputer -= new Publisher.PubComputerEventHandler(ls.Receive);
 95            pub.issueComputer("电脑杂志", Convert.ToDateTime("2010-12-24"));
 96            pub.issueLife("生活杂志", Convert.ToDateTime("2010-12-24"));
 97        }

 98    }

 99}

100

posted on 2011-01-09 09:20 成大才子 阅读(135) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

关于更多关于成大才子,请访问http://hi.baidu.com/成大才子

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

链接

搜索

最新评论

阅读排行榜

评论排行榜