C#基础学习之事件的理解和应用
事件的使用和委托类似,也是分四步来实现:声明委托、定义事件、注册事件、调用事件
我们先看一下事件的定义
//定义委托
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#基础学习之事件的理解和应用的更多相关文章
- Vue – 基础学习(4):事件修饰符
Vue – 基础学习(3):事件修饰符
- salesforce lightning零基础学习(四) 事件(component events)简单介绍
lightning component基于事件驱动模型来处理用户界面的交互.这种事件驱动模型和js的事件驱动模型也很相似,可以简单的理解成四部分: 1.事件源:产生事件的地方,可以是页面中的输入框,按 ...
- jquery基础学习之事件篇(三)
一.鼠标事件 click 单击 与 dbclick 双击 用于监听用户的点击操作,在同一元素上同时绑定 click 和 dblclick 事件是不可取的...根据浏览器支持不同一个点击事件是由mous ...
- 爬虫技术 -- 基础学习(三)理解URL和URI的联系与区别
网络爬虫的基本操作是抓取网页.首先要了解下URL~~ 在理解URL之前,先了解下URI,这两个概念我曾经混淆过~@_@|| 什么是URI? Web上每种可用的资源,如:html文档.视频,图片等都由一 ...
- JavaScript基础学习(八)—事件
一.鼠标移动事件 onmouseover: 鼠标移到了上面. onmousemove: 鼠标移动了. onmouseout: 鼠标移走了. window.onload = ...
- salesforce lightning零基础学习(五) 事件阶段(component events phase)
上一篇介绍了lightning component events的简单介绍.此篇针对上一篇进行深入,主要讲的内容为component event中的阶段(Phase). 一. 阶段(Phase)的概念 ...
- C#基础学习之委托的理解和应用
委托的使用和语法定义 委托的使用是由四步来完成的,依次为:声明委托.创建委托对象.委托关联方法.调用 我们用一个例子来说明这四步如何操作,我们完成一个老板委托员工写报告的实例,看如何实现. 首先我们应 ...
- springmvc基础学习3---注解简单理解
1:@Controller 用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到纳入管理.Spring mvc框架中的action层注入,也就是控制层.控制器Contr ...
- MacOS下SpringBoot基础学习
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...
随机推荐
- [日常] go语言圣经-获取URL练习题
1.主要使用net/http和io/ioutil包 2.http.Get函数是创建HTTP请求的函数,resp这个结构体中,Body字段包括一个可读的服务器响应流 3.ioutil.ReadAll函数 ...
- httpServletRequest中的流只能读取一次的原因
首先,我们复习一下InputStream read方法的基础知识, java InputStream read方法内部有一个,postion,标志当前流读取到的位置,每读取一次,位置就会移动一次,如果 ...
- 对工厂方法模式的一些思考(java语法表示)
同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就 ...
- Android下用程序的方法为ListView设置分割线Divider样式
使用XML的时候可以使用android:divider属性为ListView设置分割线的样式(颜色或者资源文件),而在Java代码中默认提供的方法 listView.setDivider() 却只支持 ...
- Qt编译目录下exe文件执行报错问题的解决办法
使用Qt5.9.3+vs2017环境,编译项目生成Debug目录,运行其中的exe文件,出现以下错误(qt creator调试状态下或出安装包后是可以运行的): 经过查阅资料,发现是我重新配置Qt开发 ...
- CentOS7.4+MongoBD3.6.4集群(Shard)部署以及大数据量入库
前言 mongodb支持自动分片,集群自动的切分数据,做负载均衡.避免上面的分片管理难度.mongodb分片是将集合切合成小块,分散到若干片里面,每个片负责所有数据的一部分.这些块对应用程序来说是透明 ...
- Base64编码和解码实现
function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr ...
- Android使用xml文件中的array资源
Android中有种使用数组的非常简单的用法,在xml文件中获取. 创建数组资源 在value目录下创建arrays.xml文件 然后在arrays.xml文件中使用<string-array& ...
- 如何drop大表的中不用的字段 set unused column
转自 http://foxmile.blog.163.com/blog/static/81169805201143191957184/ 我 们要删除表中不用的字段,如果直接drop column,对于 ...
- BaseDAL数据层基类1
/// <summary> /// EF数据库操作基类 /// </summary> /// <typeparam name="T"></ ...