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

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方法回应(我收到杂志啦)
            }
           
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值