自定义事件:
这里主要模拟刷银行卡,手机提示刷卡信息的过程。
 
 
  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个刷卡提示方法,这样是不符合程序设计开闭原则的。
但是如果银行类向外发布一个通知,谁需要这个通知,谁就订阅它。一旦订阅者触发了这个通知,发布者就按照约定(回调传参),去通知这个订阅者,不订阅则不通知。
这样一来,程序只要拓展,而不是修改。

 

转自https://blog.csdn.net/qq_34699535/article/details/106535429?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-106535429-blog-119963230.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-106535429-blog-119963230.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=9

[转]C#中的自定义事件和EventHandler的使用的更多相关文章

  1. wpf自定义控件中使用自定义事件

    wpf自定义控件中使用自定义事件 1 创建自定义控件及自定义事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 ...

  2. DragonBones龙骨骨骼中的自定义事件(另有声音、动画事件)

    参考: DragonBones骨骼动画事件系统详解 一.在DragonBones中添加自定义事件帧 动画制作时 时间轴拉到最下面有一个事件层,添加一个事件帧 左边属性面板定义自定义事件 二.Egret ...

  3. Spring中实现自定义事件

    原理: 通过扩展ApplicationEvent,创建一个事件类CustomEvent.这个类必须定义一个默认的构造函数,它应该从ApplicationEvent类中继承的构造函数. 一旦定义事件类, ...

  4. vue--组件中的自定义事件

    父组件通过props向子组件传递数据,子组件通过自定义事件向父组件传递信息. 在子组件中通过$emit触发事件,父组件在直接使用子组件的地方使用v-on(即@)来监听子组件触发的事件. 举例:(不知道 ...

  5. DOM3中的自定义事件

    DOM3级还定义了自定义事件,自定义事件不是由DOM原生触发的,它的目的是让开发人员创建自己的事件.要创建的自定义事件可以由createEvent("CustomEvent"); ...

  6. JS 中的自定义事件和模拟事件

    在 JS 中模拟事件指的是模拟 JS 中定义的一些事件,例如点击事件,键盘事件等. 自定义事件指的是创建一个自定义的,JS 中之前没有的事件. 接下来分别说一下创建这两种事件的方法. 创建自定义事件 ...

  7. 【转】Flash AS3.0 中的自定义事件

    原文 http://www.cnblogs.com/acpp/archive/2010/10/19/1855670.html package { import flash.events.Event; ...

  8. 使用jQuery在javascript中自定义事件

    js中的自定义事件有attachEvent,addEventListener等等好多种,往往受困于浏览器兼容,而且代码写起来也相当麻烦.jQuery为我们解决了这个问题,几行代码就可以很好的实现事件的 ...

  9. javascript和jquey的自定义事件小结

    “通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...

  10. JavaScript使用自定义事件实现简单的模块化开发

    WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...

随机推荐

  1. Redis 源码解读之逐出策略

    Redis 源码解读之逐出策略 背景和问题 本文想解决的问题: redis 触发逐出的时机是怎样的? redis 逐出策略有哪些? 如何在海量的 key 中快速找到逐出评价值(idle)最高的key, ...

  2. 0x06_自制操作系统My-OS,IDT,GDT,PIC初始化,实现键盘中断

    把class03改成class04 IDT,GDT,PIC 我来介绍什么是IDT和GDT,PIC,怎么实现键盘中断 GDT全局描述表在16位CPU用不到,到了32位CPU要用. 16位CPU实模式用基 ...

  3. element-UI button按钮颜色回显(一)

    按钮: <el-button id="manyou" @click="Ismovement" type="primary" >漫 ...

  4. 基于FLink实现的实时安全检测(一段时间内连续登录失败20次后,下一次登录成功场景)

    研发背景 公司安全部目前针对内部系统的网络访问日志的安全审计,大部分都是T+1时效,每日当天,启动Python编写的定时任务,完成昨日的日志审计和检测,定时任务运行完成后,统一进行企业微信告警推送.这 ...

  5. P3804 【模板】后缀自动机 (SAM) && P6139 【模板】广义后缀自动机(广义 SAM)

    普通 \(\text{SAM Code}\) #include <cstdio> #include <iostream> #include <cstring> #d ...

  6. 这些 JavaScript 笔试题你能答对几道?

    收藏 javascript-questions 这个仓库很久了,趁着周末来锻炼下自己的 JS 基础水平 因为逐渐也在承担一些面试工作,顺便摘录一些个人觉得比较适合面试的题目和方向 事件流(捕获.冒泡) ...

  7. python 依据IP查找其所属网段

    # coding = 'utf-8' # 依据excel表格中所提供的IP,在另一张表中查找其所属网段 import pandas as pd import IPy df = pd.read_exce ...

  8. 益赛普等TNFi持续治疗强直性脊柱炎的长期疗效观察(≥3年)

    北大深圳医院风湿免疫科在2021年发表了益赛普等TNFi持续治疗强直性脊柱炎的长期(≥3年)疗效观察[1]. 入排条件严苛,坚持随访不容易 观察对象是2009-2019年间就诊于该科室的AS患者,需有 ...

  9. Postgresql模板数据库之template1 和 template0

    一.简介 template1和template0是PostgreSQL的模板数据库.所谓模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库 ...

  10. PostgresSql更改字段位置后,数据库异常

    SQL server的studio有一个功能,可以随意拖拽表字段,更改其位置并使之重新排序,有同事问起,Postgres是否也可以.Postgres每个字段的顺序是在系统表pg_attribute里面 ...