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 ...
随机推荐
- MAC brew install 跳过 update
相信很多用 MAC 小伙伴的小伙伴都对 HomeBrew 很熟悉. 但是! 都遇到过这样的问题, 每次安装新东西, 它都要先去 update 一下, 那个耗时啊-. 怎么才能不 update, 直接安 ...
- [转]Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍
原文链接: Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍
- 基于AT89C51的数字时钟课程设计
摘要:单片微型计算机简称单片机,又称为微控制器,是将CPU.RAM.ROM.定时/计数器.I/O接口电路集成到一块电路芯片上构成的微型计算机.本次设计的系统由单片机系统.数码管显示系统.键盘.蜂鸣器等 ...
- .NET 响应式编程 System.Reactive 系列文章(三):Subscribe 和 IDisposable 的深入理解
.NET 响应式编程 System.Reactive 系列文章(三):Subscribe 和 IDisposable 的深入理解 引言:为什么理解 Subscribe 和 IDisposable 很重 ...
- Note -「A. Algebra 24 Aut.」“还有一束日光正在为你送达”
欢迎勘误吖! 喵, 你可以 Ctrl-F 搜 "lww" 获取少量 lww 笑话. (雾 ↓下面这个是我目前用的 LaTeX 宏, 如果需要可以 "Show ...
- C# Caching---Cache 缓存
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...
- pymysql数据库操作
1.安装pymsql pip install pymysql 2.导入包 import pymysql 3.连接数据库 conn=pymysql.connect(host='主机地址',user= ...
- c++:-0
了解 特征 1.继承 2.多态 打球:打乒乓球.打篮球 3.封装 例: class Clock { public: void setTime(int newH, int newM, int newS) ...
- MongoDB:【索引的管理操作】
- 深入理解Mybatis分库分表执行原理
前言 工作多年,分库分表的场景也见到不少了,但是我仍然对其原理一知半解.趁着放假前时间比较富裕,我想要解答三个问题: 为什么mybatis的mapper.xml文件里的sql不需要拼接表名中的分表? ...