深入理解事件(Event)
前言
在前一篇文章中讲到了Event 发布与订阅(一) 里面用到了事件来实现一些发布与订阅,当时对事件及其委托理解的还不是太深入,可能在使用上有点捉急。这篇来好好讲讲事件,以及通过一些小DEMO来加深理解。可以说是让我重新理解了事件。
事件(Event)
事件:
定义了事件成员的类型允许类型(或类型的实例)通知其他对象发生特定的事情。例如:Button类提供了Click事件。应用程序中的一个或多个对象可接受关于该事件的通知,以便在Button被单击之后采取特定操作。
定义了事件成员的类型能提供以下功能。
- 方法能登记它对事件的关注
- 方法能注销它对事件的关注
- 事件发生时,登记了的方法将收到通知
CLR事件模型以委托为基础。委托时调用回调方法的一种类型安全的方式。对象凭借回调方法接受它们订阅的通知。
核心指南
想要实现一个事件,按照下面这四个步骤走:
1. 定义附加信息
定义类型来容纳所有需要发送给事件通知接收者的附加信息
这句话怎么理解呢,就以之前我们那个Car为例子。把它抽象出事件来看,我要定义一个开车通知事件,我想要知道的是 司机 和乘客都是谁:那么我们就定义一个长这样的:
using System;
using EventDemo.EventBus;
namespace EventDemo.CarDemo {
public class CarNotificationEventData : EventData {
private string _driverName;
private string _passengerName;
public CarNotificationEventData (string driver, string passenger) {
_driverName = driver;
_passengerName = passenger;
}
public string Driver { get { return _driverName; } }
public string Passenger { get { return _passengerName; } }
public DateTime NotifiDate { get { return DateTime.Now; } }
}
}
那么我们就完成第一步了。
2. 定义事件成员
using System;
using System.Threading;
namespace EventDemo.CarDemo {
//...
public class CarManager {
//定义一个 上车通知 事件 成员类型为 CarNoticationEventHandler
public event CarNotificationEventHandler CarNotification;
//...
}
CarNotification 是事件名称,事件成员的类型为 CarNotificationEventHandler。 这意味着 事件通知的 所有接收者都必须提供一个原型和 CarNotificationHandler 委托类匹配的回调方法。
CarNotificationHandler 的定义为:
public delegate void CarNotificationEventHandler (CarNotificationEventData eventData);
3. 定义负责引发事件的方法来通知事件的登记对象
我在CarManager 中当然是定义一个 开车了 方法,来通知所有该事件的接受者说明车要开了。
public void OnCarToRun (CarNotificationEventData carNotificationEventData) {
//将委托字段的引用复制到一个临时变量中,出于线程安全的考虑
CarNotificationEventHandler temp = Volatile.Read (ref CarNotification);
if (temp != null) {
temp (carNotificationEventData);
}
}
4. 定义方法将输入转化为期望事件
这就是步骤中的最后一步了,就是引发这个事件。在我们的场景中就是,把司机和乘客都叫上车,然后我们就发车了。
public void RunCar (Driver driver, Passenger passenger) {
CarNotificationEventData carNotificationEventData = new CarNotificationEventData (driver.Name, passenger.Name);
OnCarToRun (carNotificationEventData);
}
把司机和乘客,添加到附加信息对象里面。然后就引发这个通知事件。
通过上面那四个步骤,应该对事件有个比较深入的了解,最后只需在各个事件的接受者里定义回调方法的处理就可以啦。
这里给出其中一个处理:
public void DriverHandle (CarNotificationEventData carNotificationEventData) {
Console.WriteLine ("Driver Hanlder---------");
Console.WriteLine (carNotificationEventData.Driver + "\n" + carNotificationEventData.Passenger +
"\n" + carNotificationEventData.NotifiDate);
}
至此,整个事件的发布,接收和处理都已完毕。如有错误的地方,一起来讨论讨论。
深入理解事件(Event)的更多相关文章
- 深入理解事件(event)与委托(delegate)
好久没学.NET了,最近重又开始学习,发现委托有很多变化了,发现事件不明白了(可能以前就没明白过) 网上搜索了几篇文章,也没注意什么时候的,发现都讲的不彻底,综合一下,也当个学习笔记. using S ...
- 理解事件(Event)
Overview 在前几章,我们已经对委托有了一个完整的了解了,本章将会对事件进行一下介绍: 相对于委托,事件再是我们更加频繁的接触的,比如 鼠标的click 事件,键盘的 keydown 事件等等. ...
- C#事件(event)解析
事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- 重温委托(delegate)和事件(event)
1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...
- Yii2基本概念之——事件(Event)
说起事件(event),我们可是一点都不陌生.现实生活当中的事件无处不在,比如你发了一条微博,触发了一条事件,导致关注你的人收到了一条消息,看到你发的内容:比如你通过支付宝买东西,付了款,触发一个事件 ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- 详解 Solidity 事件Event - 完全搞懂事件的使用
很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...
- Spark2.1.0——深入理解事件总线
Spark2.1.0——深入理解事件总线 概览 Spark程序在运行的过程中,Driver端的很多功能都依赖于事件的传递和处理,而事件总线在这中间发挥着至关重要的纽带作用.事件总线通过异步线程,提高了 ...
随机推荐
- 如何使用maven搭建web项目
博客园注册了有二十多天了,还没有写过博客,今天就发一篇,也便于后面查找笔记. 我个人已经做了几年的java web开发了,由于所在的公司是业务型公司,用的都是一些老旧的稳定技术,很少接触到稍微新点的内 ...
- centos 7.0远程登录
http://blog.csdn.net/e1219092641/article/details/79586476 linux在虚拟机上操作也是有许多不便之处的,但是远程登录的使用可以使操作简单不少, ...
- New UWP Community Toolkit - RadialGauge
概述 New UWP Community Toolkit V2.2.0 的版本发布日志中提到了 RadialGauge 的调整,本篇我们结合代码详细讲解 RadialGauge 的实现. Radi ...
- 使用jmeter+ant进行接口自动化测试(数据驱动)之二:利用apache-ant执行测试用例并生成HTML格式测试报告
在 使用jmeter+ant进行接口自动化测试(数据驱动)之一 介绍了如何使用csv文件来批量管理接口 本次接着介绍如何利用apache-ant执行测试用例并生成HTML格式测试报告 ①下载安装 ap ...
- MySQL之数据的insert-delete-update操作
主要是对数据的一些基本操作:增加.删除.修改
- 第一次作业:来自一个奋斗的IT学子
第一部分 结缘计算机 1.1你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 说起为何结缘了计算机,就得谈谈专业报考了,我觉得我的报考真是一个反面教科书了.由于高中以前每天只要想着 ...
- beta冲刺4
昨天的问题: 我的社团数据库表项的处理,代码修改后结果无法显示. 帖子内容无法显示出来. 首页图像未替换 登陆整合没有完成 今天的完成: 服务器部署成功 页面背景修改.(已上传,未确认实装.) 任务截 ...
- 20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计
20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 ...
- JAVA_SE基础——39.继承
在面向对象程序设计中,可以从已有的类派生出新类. 这称做继承(inheritance). 白话解释: 例子1:继承一般是指晚辈从父辈那里继承财产,也可以说是子女拥有父母给予他们的东西. 例子2:猫和狗 ...
- 前端双引号单引号,正则反向引用,js比较jq
1.js,jq,css,html属性必须双,如果同时出现需要嵌套使用,属性的规范是双但是也可以用单测试有效 单引号现象举例:jq中获取元素标签是单引号:$('input').click:弹出也是单引号 ...