C#中的自定义事件和EventHandler的使用

自定义事件:
这里主要模拟刷银行卡,手机提示刷卡信息的过程。
  1. 声明一个委托类型
public delegate void DelMethod(string bankName,decimal deposit,decimal amount);  //委托与类平级
  1. 创建一个银行卡类,刷卡的时候会触发通知事件
	public class BankCard
    {
        public string BankName { set; get; }
        public decimal Balance { set; get; }
        public BankCard(string bankName, decimal balance)
        {
            this.BankName = bankName;
            this.Balance = balance;
        }
        public event DelMethod OnNotification;//事件和方法平级
        public void BrushCard(decimal amount)
        {
            this.Balance-=amount;
            if (OnNotification != null)
            {
                OnNotification(this.BankName, this.Balance, amount);
            }
       	 }
     }
  1. 创建一个手机类,用于发送提示信息
    public class CellPhone
    {
        public void ShowShortMessage(string bankName, decimal balance,decimal amount)
        {
            Console.WriteLine("您{0}卡已经刷卡消费{1}元,目前余额为{2}元,如不是本人操作,请立即与本行联系。。", bankName, amount, balance);
        }
    }
  1. 调用
		static void Main(string[] args)
        {
            BankCard bankCard = new BankCard("中国银行",10000m); //创建一个银行卡
            CellPhone iPhone = new CellPhone(); //创建一个手机
            bankCard.OnNotification += new DelMethod(iPhone.ShowShortMessage); //订阅银行卡刷卡事件
            bankCard.BrushCard(500); //刷卡
            Console.ReadLine();
        }

运行结果:

下面使用标准事件EventHandler事件,并且传参给回调函数。

  1. 声明一个银行卡类
public class BankCard
    {
        //为银行卡类创建一个泛型的事件
        public event EventHandler<eventHandleArgs> Eventargs;
        //事件触发方法,触发的时候传入一个银行名称
        public void IssrueEvent(string bankName)
        {
            //创建自定义实例,因为这里需要将方法的参数赋值给对象的属性
            eventHandleArgs args = new eventHandleArgs();
            args._BankName = bankName;
            if (Eventargs != null)
                //触发事件,然后将自定义的对象作为事件触发类型传入
                Eventargs(this, args);
        }
    }
  1. 创建手机类用于通知刷卡信息
 public class Phone
    {
        public void ShowMessage(object sender, EventArgs e)
        {
            //由于EventArgs类是eventHandleArgs类的父类,所以可以强转为子类对象
            eventHandleArgs handle = (eventHandleArgs)e;
            Console.WriteLine("您{0}卡出现了一笔消费,如果不是你本人操作请与本行联系!", handle._BankName);
        }
    }
  1. 自定义一个用于传递银行名称的类,继承自EventArgs类
  public class eventHandleArgs : EventArgs
    {
        public string _BankName;
    }
  1. 调用
 static void Main(string[] args)
        {
            BankCard bankCard = new BankCard();
            Phone iPhone = new Phone();
            bankCard.Eventargs += new EventHandler<eventHandleArgs>(iPhone.ShowMessage);
            bankCard.IssrueEvent("中国银行");
            Console.ReadLine();
        }
  1. 运行结果:

总结:有些人会说,直接调用方法不就可以了,干嘛还要订阅事件?
针对以上例子,我们设想一个场景。一旦有人刷卡一次,银行类就需要在源代码中增加手机提示方法,来100个人刷卡就需要增加100个刷卡提示方法,这样是不符合程序设计开闭原则的。
但是如果银行类向外发布一个通知,谁需要这个通知,谁就订阅它。一旦订阅者触发了这个通知,发布者就按照约定(回调传参),去通知这个订阅者,不订阅则不通知。
这样一来,程序只要拓展,而不是修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值