Software--C#--grammer_Delegate--Event
2018-05-01 10:49:47
委托是一种类型,而事件是一个类或结构的成员,如同字段,属性。必须在类或结构中声明。
引申 - Observe 观察者模式 Publish/Subscribe 发布-订阅模式

一 基本形式
1. 如上图所示,声明委托,类中构建 事件 及 触发代码
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace EventDemo
8 {
9 // Event 1 of 5 elements -- deletegate declare
10 delegate void Handler();
11
12 // Publisher
13 // 1. Event declare
14 // 2. fire event code
15 class Incrementer
16 {
17 public event Handler eventPub; // create event
18
19 // 触发事件的代码
20 public void DoIncrement()
21 {
22 for(int i = 0; i < 100; i++)
23 {
24 if (i % 12 == 0 && eventPub != null)
25 eventPub();
26 }
27 }
28
29 }
30 }
2. 订阅者中 创建事件处理程序 及 注册事件。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace EventDemo
8 {
9 /*
10 * 订阅者
11 * 1.事件处理程序
12 * 2.构造器中注入 Publisher,构造代码中给事件添加处理程序方法。订阅事件。
13 */
14 class subscribeCode
15 {
16 public int DozoneCount { get; private set; }
17
18 // 事件处理程序
19 void IncrementCount()
20 {
21 DozoneCount++;
22 }
23
24 // 构造器 订阅事件
25 public subscribeCode(Incrementer inc)
26 {
27 DozoneCount = 0;
28 inc.eventPub += IncrementCount;
29 }
30
31 }
32 }
二 EventHandler
public vodi EventHandler ( Object sender, EventArgs e)
(this, null ) 来匹配一致
三 需要传输数据时 自定义 EventArgs 派生类。
1. 首先定义 派生子 EventArgs 的类
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace EventDemo.CustomerDefine
8 {
9 /* public void EventHandler(Object sender, EventArgs e)
10 * EventArgs 被设计为不能传递任何参数,
11 * 需要声明派生自 EventArgs 的类,自定义保存数据的字段。
12 *
13 * 命名规范 以 Args结尾
14 */
15 public class CustomerEventArgs : EventArgs
16 {
17 public int DestinateData { get; set; }
18 }
19 }
自定义 EventArgs 派生类
2. 其余步骤同上,注意定义 事件处理程序时
1)返回值为 void。
2) Publisher
3)Subscribe
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace EventDemo.CustomerDefine
8 {
9 class SubscribeClass
10 {
11 public int transferData { get; set; }
12
13 public void AccountMethod(Object send, CustomerEventArgs e)
14 {
15 Console.WriteLine("{0} transfer data,/t {1} send",
16 e.DestinateData, send.ToString());
17 transferData++;
18 }
19 public SubscribeClass(PublisherClass pc)
20 {
21 transferData = 0;
22 pc.handler += AccountMethod;
23 }
24 }
25 }
注意 移除事件处理程序 是从最后的寻找第一个匹配的,类似于 委托的方法移除
高级用法, 事件访问器
将 += -= 改变。 让事件执行任何我们希望的自定义代码。
两个访问器 add remove
声明事件访问器 类似于 声明一个属性 返回 void
public event EventHandler CountedADozen
{
add
{ ... } // 执行 += 运算符
remove
{ ... } // 执行 -= 运算符
}
声明之后,事件不包含任何内嵌委托对象。必须实现自己的机制来存储和移除时间注册的方法。
Software--C#--grammer_Delegate--Event的更多相关文章
- How Google Tests Software - The Life of a TE
By James WhittakerThe Test Engineer is a newerrole within Google than either SWEs or SETs. As such, ...
- PatentTips - Virtualizing performance counters
BACKGROUND Generally, the concept of virtualization in information processing systems allows multipl ...
- PatentTips - Virtual machine management using processor state information
BACKGROUND OF THE INVENTION The invention generally relates to virtual machine management, and more ...
- Let Start
A free timing software with very small memory occupation. This tool is a pure green convenient off ...
- HDU-1171 Big Event in HDU
Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...
- Big Event in HDU
Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe ...
- 组合数学 - 母函数的变形 --- hdu 1171:Big Event in HDU
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1171 Big Event in HDU 多重背包二进制优化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Jav ...
- Big Event in HDU[HDU1171]
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- java event
What is an Event? Change in the state of an object is known as event i.e. event describes the change ...
随机推荐
- KMP 与 Z 函数
\(\text{By DaiRuiChen007}\) 一.KMP 算法 I. 问题描述 在文本串 \(S\) 中找到模式串 \(T\) 的所有出现,其中 \(|S|=n,|T|=m\) II. 前置 ...
- iOS 使用xcode11新建项目
1. 首先打开Xcode11,然后使用command + shift + n 快捷键创建一个新的工程 选择 Single View App 完成之后点击next 2. 会弹出 Choose opt ...
- 使用Lighthouse更好推动项目性能优化,性能指标详解,优化方法,需要关注指标分析
Lighthouse是什么---一种工具 Lighthouse 是一个开源的自动化工具,用来测试页面性能. 为什么要用Lighthouse----提升用户体验 Web性能可以直接影响业务指标,例如转化 ...
- OpenMP 线程同步 Construct 实现原理以及源码分析(上)
OpenMP 线程同步 Construct 实现原理以及源码分析(上) 前言 在本篇文章当中主要给大家介绍在 OpenMP 当中使用的一些同步的 construct 的实现原理,如 master, s ...
- day13-实现Spring底层机制-03
实现Spring底层机制-03 7.实现任务阶段5 7.1分析 阶段5目标:bean后置处理器的实现 7.2代码实现 新增: 1.创建 InitializingBean 接口,实现该接口的 Bean ...
- 在elasticsearch中简单的使用script_fields
目录 1.背景 2.准备数据 2.1 mapping 2.2 插入数据 3.案例 3.1 格式化性别 1-男 2-女 -1-未知 如果不存在sex字段,则显示-- 其余的显示 ** 3.1.1 dsl ...
- Grafana 系列文章(八):Grafana Explore 中的 Inspector
️URL: https://grafana.com/docs/grafana/latest/explore/explore-inspector/ Description: Explore 中的检查器 ...
- adb简记
ADB Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在某些特殊的情况下进入不了系统,adb就派上用场啦! 前提条件 ...
- vue-cli 更新遇到的问题,卸载不掉旧版本2.9.6(可行)
今天更新vue-cli时,遇到问题:卸载不掉旧版本2.9 官网给的信息是:Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x ...
- Canvas:绘制曲线
前言 画曲线要用到二次贝塞尔曲线或三次贝塞尔曲线.贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如 PhotoShop. 二次贝塞尔曲线 二次贝塞尔曲线在 ...