事件的使用和委托类似,也是分四步来实现:声明委托、定义事件、注册事件、调用事件

我们先看一下事件的定义

//定义委托
public delegate void PublishEventHandler(string msg);
//定义事件
public event PublishEventHandler OnPublish;

事件注册和取消注册是用+=和-=方法名来完成的,如

publisher.OnPublish += method;

最后就可以调用事件了

OnPublish(msg);

我们同样使用一个例子来理解事件,学习事件是怎么使用的。

我们现在完成一个发布订阅的过程,由发布者发布消息,订阅者接受处理

看示例代码

发布者类:

public class Publisher
{
//定义委托
public delegate void PublishEventHandler(string msg);
//
public event PublishEventHandler OnPublish; public void SendMessage(string msg)
{
Console.WriteLine(string.Format("发布一个消息:{0}", msg));
//
if (OnPublish != null)
{
//表示事件已注册
OnPublish(msg);
}
}
}

订阅者类

public class Receiver
{
public void ReceiveMessage(string msg)
{
Console.WriteLine(string.Format("接收一个消息:{0}", msg));
}
}
定义一个执行类,看事件如何调用    
public class EventExecutor
{
public static void Run()
{
Publisher publisher = new Publisher();
string msg = "今天发工资了";
Receiver receiver = new Receiver();
//注册事件,订阅
publisher.OnPublish += receiver.ReceiveMessage;
publisher.SendMessage(msg);
}
}

我们发现事件是依附于委托存在的,使用上和委托几乎相同,都是先声明再注册调用。

上面的例子我们直接使用委托实现也很简单,在Publisher类我们定义委托对象

//使用委托实现
public PublishEventHandler publishEventHandler;

调用类中如下注册

//使用委托实现
publisher.publishEventHandler = new Publisher.PublishEventHandler(receiver.ReceiveMessage);
那到底事件的存在意义是什么

事件其实是使用了委托链,类似对委托的一种封装,在注册事件时,我们只能通过+=Method的形式进行注册,而无法再像委托注册的时候直接给委托对象赋值。

其他的我也不太清楚哪些是委托不能完成的,还请大神指点

C#基础学习之事件的理解和应用的更多相关文章

  1. Vue – 基础学习(4):事件修饰符

    Vue – 基础学习(3):事件修饰符

  2. salesforce lightning零基础学习(四) 事件(component events)简单介绍

    lightning component基于事件驱动模型来处理用户界面的交互.这种事件驱动模型和js的事件驱动模型也很相似,可以简单的理解成四部分: 1.事件源:产生事件的地方,可以是页面中的输入框,按 ...

  3. jquery基础学习之事件篇(三)

    一.鼠标事件 click 单击 与 dbclick 双击 用于监听用户的点击操作,在同一元素上同时绑定 click 和 dblclick 事件是不可取的...根据浏览器支持不同一个点击事件是由mous ...

  4. 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别

    网络爬虫的基本操作是抓取网页.首先要了解下URL~~ 在理解URL之前,先了解下URI,这两个概念我曾经混淆过~@_@|| 什么是URI? Web上每种可用的资源,如:html文档.视频,图片等都由一 ...

  5. JavaScript基础学习(八)—事件

    一.鼠标移动事件      onmouseover: 鼠标移到了上面.      onmousemove: 鼠标移动了.      onmouseout: 鼠标移走了. window.onload = ...

  6. salesforce lightning零基础学习(五) 事件阶段(component events phase)

    上一篇介绍了lightning component events的简单介绍.此篇针对上一篇进行深入,主要讲的内容为component event中的阶段(Phase). 一. 阶段(Phase)的概念 ...

  7. C#基础学习之委托的理解和应用

    委托的使用和语法定义 委托的使用是由四步来完成的,依次为:声明委托.创建委托对象.委托关联方法.调用 我们用一个例子来说明这四步如何操作,我们完成一个老板委托员工写报告的实例,看如何实现. 首先我们应 ...

  8. springmvc基础学习3---注解简单理解

    1:@Controller 用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到纳入管理.Spring mvc框架中的action层注入,也就是控制层.控制器Contr ...

  9. MacOS下SpringBoot基础学习

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...

随机推荐

  1. rabbitmq-channel方法介绍

    先介绍rabbmitmq的几个方法: // 声明一个队列 -// queue 队列名称 // durable 为true时server重启队列不会消失 (是否持久化) // exclusive 队列是 ...

  2. 解决vuejs应用在nginx非根目录下部署时访问404的问题

    以往部署vuejs应用都是直接在nginx的location为/下直接部署,这次遇到要将vue应用部署在/vuejs-admin的非根下,使用以往部署方案直接访问就会404,这时修改步骤如下: 1.修 ...

  3. 手把手教你写一个java的orm(一)

    写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...

  4. myBatis组件之缓存实现及使用

    一 .概述 先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充 Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能:除核心功能之外,有很多额外的附加 ...

  5. 深入理解MyBatis的原理(三):配置文件(上)

    前言:前文提到一个入门的demo,从这里开始,会了解深入 MyBatis 的配置,本文讲解 MyBatis 的配置文件的用法. 目录 1.properties 元素 2.设置(settings) 3. ...

  6. Q:链表的中间元素

    问题:如何得到一个链表的中间元素?   相信,这个问题对于刚入门编程的人来说,都不会难,最自然而然的想法是先遍历一遍链表,统计链表中的元素的个数,之后,再走一遍链表,所走的步长为链表长度的一半.这样就 ...

  7. vs2017 + Python3.6 +Django1.11 连接mysql数据库

    不废话直接来. vs2017创建一个新的python web项目之后默认链接数据库是sqlite.但是我就想连接到Mysql 上面玩,于是开始倒腾了.下面是步骤 1.修改settings.py 文件需 ...

  8. Unable to load script from assets 'index.android.bundle' 出错?

    野路子太多,坑人真的!F**k 言归正传,当你运行 react native 程序的时候出现这个错误 ,如果您使用Windows,请按以下方式运行命令,或者如果出现错误“无法找到条目文件index.a ...

  9. 规划行业GIS云平台“城智图”上线运行

    首先祝各位朋友中秋节快乐! 城智图(www.imapcity.com)是远景GIS云平台的首个应用项目,它以全新的方式为规划部门提供地理信息服务,改变了以前规划部门只有CAD成果数据,难以查阅.深入挖 ...

  10. 一步一步 Pwn RouterOS之调试环境搭建&&漏洞分析&&poc

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文分析 Vault 7 中泄露的 RouterOs 漏洞.漏洞影 ...