C# 之事件及event关键字存在的意义
总结:event关键字的作用,用于不公开发布器中委托对象实例,对事件委托对象进行保护,禁止外部调用。
1、C#事件举例说明
1 //事件及event关键字存在的意义
2 class Program
3 {
4 //事件,发布(publisher)-订阅(subscriber)模型
5 static void Main(string[] args)
6 {
7 MouseLeftButton e = new MouseLeftButton(); /* 实例化对象,第一次没有触发事件 */
8 subscribEvent v = new subscribEvent(); /* 实例化对象 */
9 e.clickHandler += v.clickChromeBrowserIcon; /* 注册 订阅双击点击浏览器图标 */
10 //e.OnDoubleClick();
11 //e.clickHandler -= v.clickChromeBrowserIcon;
12 e.OnDoubleClick();
13 e.clickHandler += v.clickWeChatIcon;
14 Console.WriteLine("我手速比较快,同时点击了浏览器标签和微信标签");
15 e.OnDoubleClick();
16
17 }
18 }
19
20
21 //事件订阅器类,提供事件处理程序的对象,就是事件发生了要做什么事情。
22 public class subscribEvent
23 {
24 //点击谷歌浏览器图标
25 public void clickChromeBrowserIcon()
26 {
27 Console.WriteLine("浏览器打开,我输入了博客园网址打开了博客园网站首页!");
28 }
29
30 //点击桌面微信图标
31 public void clickWeChatIcon()
32 {
33 Console.WriteLine("微信客户端打开,我登录了我的微信!");
34 }
35 }
36
37 //事件发布器类,用于发布事件,包含事件和委托定义的对象。
38 //定义MouseLeftButton类,模拟鼠标左键对象
39 public class MouseLeftButton
40 {
41 //声明一个鼠标点击委托
42 public delegate void ClickHandler();
43
44 public event ClickHandler clickHandler;
45
46 public void OnDoubleClick()
47 {
48 if (clickHandler != null)
49 {
50 clickHandler(); /* 事件被触发 */
51 }
52 else
53 {
54 Console.WriteLine("无订阅事件处理程序,未检测到点击相应按钮,点击无效!");
55 }
56 }
57
58 public MouseLeftButton() {
59 OnDoubleClick();
60 }
61
62 }
2、去掉event关键字不要,程序也能正常执行。但是,这是发布器类的委托失去了保护,可以触发任何可能的操作。
1 //事件及even关键字存在的意义
2 class Program
3 {
4 //事件,发布(publisher)-订阅(subscriber)模型
5 static void Main(string[] args)
6 {
7 MouseLeftButton e = new MouseLeftButton(); /* 实例化对象,第一次没有触发事件 */
8 subscribEvent v = new subscribEvent(); /* 实例化对象 */
9 e.clickHandler += v.clickChromeBrowserIcon; /* 注册 订阅双击点击浏览器图标 */
10 e.clickHandler += v.clickWeChatIcon;
11 Console.WriteLine("我的电脑不受控制了,没有点击也打开了浏览器和微信!");
12 e.clickHandler();//可以直接调用了委托
13
14 }
15 }
16
17
18 //事件订阅器类,提供事件处理程序的对象,就是事件发生了要做什么事情。
19 public class subscribEvent
20 {
21 //点击谷歌浏览器图标
22 public void clickChromeBrowserIcon()
23 {
24 Console.WriteLine("浏览器打开,我输入了博客园网址打开了博客园网站首页!");
25 }
26
27 //点击桌面微信图标
28 public void clickWeChatIcon()
29 {
30 Console.WriteLine("微信客户端打开,我登录了我的微信!");
31 }
32 }
33
34 //事件发布器类,用于发布事件,包含事件和委托定义的对象。
35 //定义MouseLeftButton类,模拟鼠标左键对象
36 public class MouseLeftButton
37 {
38 //声明一个鼠标点击委托
39 public delegate void ClickHandler();
40
41 public ClickHandler clickHandler;
42
43 public void OnDoubleClick()
44 {
45 if (clickHandler != null)
46 {
47 clickHandler(); /* 事件被触发 */
48 }
49 else
50 {
51 Console.WriteLine("无订阅事件处理程序,未检测到点击相应按钮,点击无效!");
52 }
53 }
54
55 public MouseLeftButton() {
56 OnDoubleClick();
57 }
58
59 }
3、加上关键字event后,会发现以下错误

C# 之事件及event关键字存在的意义的更多相关文章
- event 关键字
event(C# 参考) event 关键字用于在发行者类中声明事件.下面的示例演示如何声明和引发将 EventHandler 用作基础委托类型的事件. C# public class SampleE ...
- C#事件(Event)学习日记
event 关键字的来由,为了简化自定义方法的构建来为委托调用列表增加和删除方法. 在编译器处理 event 关键字的时候,它会自动提供注册和注销方法以及任何必要的委托类型成员变量. 这些委托成员变量 ...
- 雷林鹏分享:C# 事件(Event)
C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. ...
- C# 事件(Event)
事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. 通过事件使用委托 事件在 ...
- 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护
建议40:使用event关键字为委托施加保护 在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUpl ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)
[学习资料] <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.bai ...
- 委托与事件--delegate&&event
委托 访问修饰符 delegate 返回值 委托名(参数); public delegate void NoReturnNoPara(); public void NoReturnNoParaMeth ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
随机推荐
- aws命令行cli创建VPC网络、公有子网、私有子网、nat网关+EIP
在AWS部署海外节点, 图简单使用web控制台创建VPC和k8s集群出错(k8s), 使用cli命令行工具创建成功 本实例为复盘, 记录aws命令行工具cli创建VPC网络, a区和b区分别创建公有子 ...
- Premiere剪辑加速
使用AE或者Premire的时候,如果需要导出文件,有的文件还是挺大的,处理起来疯狂占用CPU,经常导致别的工作无法进行. 如果能够使用GPU进行压缩工作就好了,如果你用一块独立显卡,那么就可以正常使 ...
- 【问题解决】Pycharm、IDAE等乱码问题:运行输出窗口就正常显示,调试乱码的问题
添加如下内容 -Dfile.encoding=UTF-8 重启软件生效
- 2019.12.10笔记——Spring Boot热部署的使用和实现自己的热部署(类加载器相关)
Spring Boot热部署 热部署的使用 引入依赖 <!-- spring boot热部署的依赖 --> <dependency> <groupId>org.sp ...
- 利用H2的自定义函数更好的支持测试
在写DAO层的单元测试时,用mock的写法意义不大,因为DAO层的测试更多的关注是Java对象的传递和生成SQL的正确性,所以需要链接真实的数据库. 但是对于单元测试,真实的数据库是很重的,还要依赖于 ...
- Qt编写安防视频监控系统66-子模块10网页浏览
一.前言 网页浏览模块,用于传入一个网页地址,打开对应的网页进行浏览,可用于网页展示信息,支持多个,可以自行增加,代码中演示了一个.此模块的用途属于添砖加瓦润色用的,比如有一个牛逼的3D网页,机器人. ...
- 循规蹈矩--从零开始建设k8s监控(一)
前言 监控k8s集群,目前主流就是使用prometheus以及其周围的生态,本文开始介绍怎么一步步完成k8s监控的建设 环境准备 组件 版本 操作系统 Ubuntu 22.04.4 LTS minik ...
- Ant入门简单实例
一.构建ant环境 要使用ant首先要构建一个ant环境,步骤很简单: 1) 安装jdk,设置JAVA_HOME ,PATH ,CLASS_PATH(这些应该是看这篇文章的人应该知道的) 2) 下载a ...
- 微信团队分享:详解iOS版微信视频号直播中因帧率异常导致的功耗问题
本文由微信客户端团队rhythm分享,原题"视频号直播:如何进一步降低功耗占用?",本文有修订和改动. 1.引言 功耗优化一直是 app 性能优化中让人头疼的问题,尤其是在直播这种 ...
- 理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨
本文作者"商文默",本次有修订和改动. 1.写在前面 即时通讯网整理的大量IM技术文章中(见本文末"参考资料"一节),有关消息可靠性和一致性问题的文章占了很大比 ...