总结: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关键字存在的意义的更多相关文章

  1. event 关键字

    event(C# 参考) event 关键字用于在发行者类中声明事件.下面的示例演示如何声明和引发将 EventHandler 用作基础委托类型的事件. C# public class SampleE ...

  2. C#事件(Event)学习日记

    event 关键字的来由,为了简化自定义方法的构建来为委托调用列表增加和删除方法. 在编译器处理 event 关键字的时候,它会自动提供注册和注销方法以及任何必要的委托类型成员变量. 这些委托成员变量 ...

  3. 雷林鹏分享:C# 事件(Event)

    C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. ...

  4. C# 事件(Event)

    事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. 通过事件使用委托 事件在 ...

  5. 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护

    建议40:使用event关键字为委托施加保护 在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUpl ...

  6. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  7. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  8. 【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)

    [学习资料] <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.bai ...

  9. 委托与事件--delegate&&event

    委托 访问修饰符 delegate 返回值 委托名(参数); public delegate void NoReturnNoPara(); public void NoReturnNoParaMeth ...

  10. [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event   事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...

随机推荐

  1. 解决编译redis报错zmalloc.h:50:10: fatal error: jemalloc/jemalloc.h: No such file or directory

    编译redis时报错:zmalloc.h:50:10: fatal error: jemalloc/jemalloc.h: No such file or directory,执行: # sudo m ...

  2. Linux新用户登录时出现“-bash-4.2$”的解决办法

    Linux服务器新建的用户在登录时显示"-bash-4.2$",而不是"user@hostname"的显示方式,出现此问题的原因是在添加普通用户时,用户家目录下 ...

  3. Socket、Http、WebSocket?强大的Netty几行语句就帮你实现!

    一.概述 Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 相比 ...

  4. Qt编写视频监控系统76-Onvif跨网段组播搜索和单播搜索的实现

    一.前言 在视频监控行业一般会用国际onvif工具来测试设备是否支持onvif协议,工具的名字叫ONVIF Device Manager(还有个工具叫ONVIF Device Test Tool,专用 ...

  5. Qt数据库应用4-数据打印到纸张

    一.前言 数据能够打印到pdf文件,当然可以打印到纸张,而且使用qprinter默认就是打印到纸张的,上一篇文章写得功能是打印到pdf,其实还要单独特殊设置打印到文件,并指定格式为pdf.不指定输出文 ...

  6. Qt音视频开发27-Onvif设备搜索

    一.前言 最近业余时间主要研究音视频开发这块,前面的文章写了好多种视频监控内核,一旦将这些内核搞定以后,视频监控的相关功能水到渠成.做视频监控系统,绕不过onvif这玩意,这玩意主要就是为了统一一个大 ...

  7. [megatron代码阅读] 1. 初始化和组网

    以pretrain_gpt.py为例, 看megatron的整体逻辑. 本章主要包括megatron初始化相关逻辑, 核心函数为initialize_megatron, setup_model_and ...

  8. biancheng-Spring MVC

    MVC设计模式简介 http://c.biancheng.net/spring_mvc/ MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Control ...

  9. java代码之美(1)

    Lambda 一.概述 1.什么是Lambda表达式 Lambda 表达式是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 它可以写出更简洁.更灵活的代码.作为一种 ...

  10. layui table表格单元格动态合并,并设置隔行变色

    layui table表格单元格动态合并,并设置隔行变色,此代码只针对嵌套数组只有一层的时候有效,多个数组嵌套还在冥想当中!! 需求描述 我们知道在layui插件官方平台有个可以无限极单元格合并的模块 ...