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 ...
随机推荐
- BC3-牛牛学说话之-整数
题目描述 牛牛刚刚出生,嗷嗷待哺,一开始他只能学说简单的数字,你跟他说一个整数,他立刻就能学会.输入一个整数,输出这个整数. 输入描述 输入一个整数,范围在32位有符号整数范围内 输出描述 输出这个整 ...
- Java基础学习笔记-运算符ヽ( ̄▽ ̄)و
运算符 运算符-按功能分为7种 1.赋值运算符 广义赋值运算符 +=, -=, *=, /=, %=, &=, |= 一般形式:变量名 运算符=表达式 两侧的类型不一致会进行 自动类型转换 和 ...
- 如何修剪git reflog历史
背景: vscode插件git-graph可以方便查看git-commit-graph,效果很好,关键是交互性很好.点选任意commit即可预览提交内容,实在是太方便了,比我之前用命令行上git lo ...
- Kubernetes(k8s)控制器(四):ReplicaSet
目录 一.系统环境 二.前言 三.ReplicaSet概览 四.ReplicaSet工作原理 五.ReplicaSet使用场景 六.创建ReplicaSet 七.扩展replicaset副本数 一.系 ...
- 力扣---1148. 文章浏览 I
Views 表:+---------------+---------+| Column Name | Type |+---------------+---------+| article_i ...
- HTTPS基础原理和配置 - 1
近期又碰到了SSL相关的事情, 就心血来潮开个新专题 - <HTTPS基础原理和配置> 本文是第一篇文章, 主要介绍SSL TLS加密协议的相关内容. 加密协议历史概要 SSL TLS加密 ...
- spring-in-action-初识反应式编程reactor
一:反应式编程 1.反应式编程的优点 1)无阻塞 2)处理的数据可以是无限的 打水仗: 命令式编程:使用的是水气球.水气球的容量有限.把水气球装水,再扔向对方.如果想要更多的水,就需要更多的水气球. ...
- 学习Java Day23
今天学习了包访问,没有指定public或private的部分可以被同一个包中的所有方法访问
- go语言面试
go面试 基础 = 和 := 的区别? **Go语言中,= 操作符用于赋值,而 := 操作符可以用于声明及赋值. Go 语言支持短变量声明(针对局部变量),以 := 为标志,这里要注意的是,Go 语言 ...
- python3 os.getcwd()和os.path.realpath()区别
在写一个android手机的自动化测试,用appium+python3,跟室友讨论拟定了一个框架,在写2个通用的简单模块时,遇到问题. 同一个目录下2个模块,driver.py(用于获取app 句柄) ...