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. 基于WebSocket的实时消息传递设计

    目录 概述 整体架构 设计 流程设计 程序设计 WebSocketServer 概述 新增pom 新增配置类 创建websocket端点 WebSocketClient 概述 安装WebSocketS ...

  2. 【随笔记】FRAM 铁电随机存储器(MB85RC04VPNF)

    参考资料 器件规格书:https://atta.szlcsc.com/upload/public/pdf/source/20131104/1457706659695.pdf I2C总线规范:https ...

  3. Node.js学习笔记----day02

    认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.简单实现Apache功能 var http = require('http') var fs = require('fs') // 1. ...

  4. 自动化运维:使用Maven与Docker运行Selenium测试

    在这篇文章中,我们将向您展示如何创建交付流水线并实现以下目标: 使用Web应用程序构建Docker镜像 在Docker容器中运行该应用程序 从不同的容器中使用Maven运行Selenium测试 出于本 ...

  5. 快速入门API Explorer

    摘要:华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放 API,支持全量快速检索.可视化调试.帮助文档.代码示例等能力,帮助开发者快速查找.学习API和使 ...

  6. C++ 从数组中拿值,每个值不相同

    代码和思路 原理就是生成0,n个索引,每个索引不相同即可. 索引再到数组拿数据就行 #include <iostream> #include <vector> #include ...

  7. spring中Utils工具类注入问题

    使用工具类的时候,我们想在static修饰的方法中,通过注入来调用其他方法,这里就存在问题. 第一:普通工具类是不在spring的管理下,spring不会依赖注入 第二:即便使用@Autowired完 ...

  8. Docker部署Nacos自动停止运行

    1.现象 使用docker部署的Nacos在运行一段时间后,就自动停止运行了. 查看docker运行容器,nacos停止了 2.解决 因为是学生购买的轻量级服务器,所以配置很低,出现这种问题我默认是内 ...

  9. C++练习8 常量的说明

    const用来声明常量,const的位置可以看出其修饰的是哪一部分 1 #include <iostream> 2 using namespace std; 3 int main() 4 ...

  10. 软赢软件控制器在Zstack云主机实现电机控制的方法

    工控领域上云实践-Zstack和软赢 在上面链接提到软赢的软件运动控制器在Zstack云主机上实现etherCat总线的电机控制,在后来的对比中发现,在云主机上虽然实现了让电机转起来,但是因为实时性还 ...