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的更多相关文章

  1. 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, ...

  2. PatentTips - Virtualizing performance counters

    BACKGROUND Generally, the concept of virtualization in information processing systems allows multipl ...

  3. PatentTips - Virtual machine management using processor state information

    BACKGROUND OF THE INVENTION The invention generally relates to virtual machine management, and more ...

  4. Let Start

      A free timing software with very small memory occupation. This tool is a pure green convenient off ...

  5. HDU-1171 Big Event in HDU

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  6. Big Event in HDU

    Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe ...

  7. 组合数学 - 母函数的变形 --- hdu 1171:Big Event in HDU

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. 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 ...

  9. Big Event in HDU[HDU1171]

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  10. java event

    What is an Event? Change in the state of an object is known as event i.e. event describes the change ...

随机推荐

  1. BC3-牛牛学说话之-整数

    题目描述 牛牛刚刚出生,嗷嗷待哺,一开始他只能学说简单的数字,你跟他说一个整数,他立刻就能学会.输入一个整数,输出这个整数. 输入描述 输入一个整数,范围在32位有符号整数范围内 输出描述 输出这个整 ...

  2. Java基础学习笔记-运算符ヽ( ̄▽ ̄)و

    运算符 运算符-按功能分为7种 1.赋值运算符 广义赋值运算符 +=, -=, *=, /=, %=, &=, |= 一般形式:变量名 运算符=表达式 两侧的类型不一致会进行 自动类型转换 和 ...

  3. 如何修剪git reflog历史

    背景: vscode插件git-graph可以方便查看git-commit-graph,效果很好,关键是交互性很好.点选任意commit即可预览提交内容,实在是太方便了,比我之前用命令行上git lo ...

  4. Kubernetes(k8s)控制器(四):ReplicaSet

    目录 一.系统环境 二.前言 三.ReplicaSet概览 四.ReplicaSet工作原理 五.ReplicaSet使用场景 六.创建ReplicaSet 七.扩展replicaset副本数 一.系 ...

  5. 力扣---1148. 文章浏览 I

    Views 表:+---------------+---------+| Column Name   | Type    |+---------------+---------+| article_i ...

  6. HTTPS基础原理和配置 - 1

    近期又碰到了SSL相关的事情, 就心血来潮开个新专题 - <HTTPS基础原理和配置> 本文是第一篇文章, 主要介绍SSL TLS加密协议的相关内容. 加密协议历史概要 SSL TLS加密 ...

  7. spring-in-action-初识反应式编程reactor

    一:反应式编程 1.反应式编程的优点 1)无阻塞 2)处理的数据可以是无限的 打水仗:  命令式编程:使用的是水气球.水气球的容量有限.把水气球装水,再扔向对方.如果想要更多的水,就需要更多的水气球. ...

  8. 学习Java Day23

    今天学习了包访问,没有指定public或private的部分可以被同一个包中的所有方法访问

  9. go语言面试

    go面试 基础 = 和 := 的区别? **Go语言中,= 操作符用于赋值,而 := 操作符可以用于声明及赋值. Go 语言支持短变量声明(针对局部变量),以 := 为标志,这里要注意的是,Go 语言 ...

  10. python3 os.getcwd()和os.path.realpath()区别

    在写一个android手机的自动化测试,用appium+python3,跟室友讨论拟定了一个框架,在写2个通用的简单模块时,遇到问题. 同一个目录下2个模块,driver.py(用于获取app 句柄) ...