总结: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. 【Python】【爬虫】爬取小说5000章,遇到的爬虫问题与解决思路

    爬虫问题分析 回顾 之前写了一个爬取小说网站的多线程爬虫,操作流程如下: 先爬取小说介绍页,获取所有章节信息(章节名称,章节对应阅读链接),然后使用多线程的方式(pool = Pool(50)),通过 ...

  2. 【bug记录】AttributeError: 'CollectReport' object has no attribute 'description'

    问题截图 问题原因 有完全重复用例,因为写用例的时候,为了图方便,直接复制的,还没来得及改,然后,用pytest运行的时候,就报这个错误了. 问题解决 去掉重复就行了

  3. 执行docker-compose up -d时出现ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule

    原因是因为防火墙关闭之后需要重启docker服务. 执行: service docker restart 即可.

  4. Ubuntu22.04 LTS 安装nvidia显卡驱动

    准备跑老师给定的Github上的多模态源码,但是用了这么久ubuntu还没有尝试过安装nvidia驱动,好在也是一次成功,于是记录下来. 借鉴的是https://blog.csdn.net/Eric_ ...

  5. Powercat 无文件落地执行技巧,你确定不进来看看?

    声明:本文主要用作技术分享,所有内容仅供参考.任何使用或依赖于本文信息所造成的法律后果均与本人无关.请读者自行判断风险,并遵循相关法律法规. 目录 完整示例 注意事项 演示 无文件落地执行(filel ...

  6. jQuery ajax - serializeArray() 方法 实例表单提交

    serializeArray()在ajax表单提交时候非常方便获取元素 定义和用法 serializeArray() 方法通过序列化表单值来创建对象数组(名称和值). 您可以选择一个或多个表单元素(比 ...

  7. 即时通讯技术文集(第45期):微信、QQ技术精华合集(Part2) [共14篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第45 期. [-1-]  QQ音乐团队分享:Android中的图片压缩技术详解(上篇) [链接 ...

  8. 零基础IM开发入门(三):什么是IM系统的可靠性?

    本文编写时引用了"聊聊IM系统的即时性和可靠性"一文的部分内容和图片,感谢原作者. 1.引言 上一篇<零基础IM开发入门(二):什么是IM系统的实时性?>讲到了IM系统 ...

  9. KeyDB-键值存储

    KeyDB项目是从redis fork出来的分支.众所周知redis是一个单线程的kv内存存储系统,而KeyDB在100%兼容redis API的情况下将redis改造成多线程. 多线程架构 线程模型 ...

  10. java基础知识回顾之java Thread类学习(三)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

    1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以 ...