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 ...
随机推荐
- 重建sln的项目层级
编写包含多个 csproj 的程序时,随着项目数量的持续增加,可能涉及一些文件夹的变动,手动添加项目或者变动会变得非常麻烦,这个时候,可以利用 dotnet cli 帮助我们完成. 如果从零开始,我们 ...
- 【MyBatis】学习笔记11:解决字段名和属性的映射关系
[Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...
- X64\X86\X86-64的区别
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- Win10正式专业版激活方法
首先,我们先查看一下Win10正式专业版系统的激活状态: 点击桌面左下角的"Windows"按钮,从打开的扩展面板中依次点击"设置"-"更新和安全 ...
- dotnet最小webApi开发实践
dotnet最小webApi开发实践 软件开发过程中,经常需要写一些功能验证代码.通常是创建一个console程序来验证测试,但黑呼呼的方脑袋界面,实在是不讨人喜欢. Web开发目前已是网络世界中的主 ...
- 超实用 JMeter BeanShell Sampler 教程
超实用 JMeter BeanShell Sampler 教程 宝子们,今天咱继续深挖 JMeter 里超厉害的 BeanShell Sampler,这次多来点实际工作中的例子,让你彻底搞懂它! 一. ...
- JMeter HTTP Request 采样器全面解析与实战指南
<JMeter HTTP Request 采样器全面解析与实战指南> 一.HTTP Request 采样器简介 宝子们,JMeter 里的 HTTP Request 采样器可厉害啦,它就像 ...
- 解决layer在移动端关闭按钮显示一半的问题
问题描述 layer弹出iframe,如果设置title为false,会自动设置closeBtn为2,也就是向右上方偏移了-28px,如果显示区域大于1100则正常,如果小于1100则会添加一段css ...
- C# WebApi 全局配置模型验证和自定义错误处理。config Filters Add ModelStateValidationFilter/CustomExceptionFilter
public static void Start() { logger.Debug("Startup WebAPI..."); SwaggerConfig.Register(); ...
- 用于决策的世界模型 -- 论文 World Models (2018) & PlaNet (2019) 讲解
参考资料: [2411.14499] Understanding World or Predicting Future? A Comprehensive Survey of World Models ...