C#总结(二)事件Event 介绍总结
最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西。前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event)。
事件(event),对于初学者来说,确实比较神秘,难懂。但是在日常编程过程中却经常遇到。事件使用得当,会让你的代码更加整洁,也能少些很多代码。
一、Event事件,是一种封装过的委托。
它拥有以下三要素:
1. 事件发行者:达到某些条件时激发事件的对象
2. 事件订阅者:订阅事件并对事件发生时进行处理的对象
3. 定义发行者和订阅者关系,一个发行者可能会有多个订阅者。
事件发行者和事件订阅者通过委托(delegate) 来实现发送方和接收方的事件触发。
它拥有哪些好处:
在以往我们编写订阅这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测事情什么时候发生,而通过事件(event),可以大大简化了这种过程:
1. 使用事件,可以很方便地确定程序执行顺序。
2. 当事件驱动程序等待事件时,它不占用很多资源。事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。如果没有消息在等待,则程序会把控制交回给操作系统,以运行其他程序。
3. 事件简化了编程。事件订阅者只是简单地将消息传送给事件发行者,由发行者的事件驱动程序确定事件的处理方法。不必知道程序的内部订阅触发机制,只是需要知道如何传递消息即可。
二、事件和委托的区别
1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用,
2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。
三、事件的声明(Event)
在类的内部声明事件,首先必须声明该事件的委托类型。例如:
public delegate void NumManipulationHandler(NumEventArgs e);
然后,声明事件本身,使用 event 关键字:
// 基于上面的委托定义事件public event NumManipulationHandler ChangeNum;
上面的代码定义了一个名为 NumManipulationHandler 的委托和一个名为 ChangeNum 的事件,该事件是在某个值生成的时候会调用委托事件。
四、实例
public class Program{public static void Main(){NumEvent even = new NumEvent(0);even.ChangeNum += EventAction.Action;even.SetValue(7);even.SetValue(11);System.Console.ReadKey();}}public class NumEvent{private int value;public delegate void NumManipulationHandler(NumEventArgs e);public event NumManipulationHandler ChangeNum;public virtual void OnChangeNum(NumEventArgs e){ChangeNum?.Invoke(e);}public NumEvent(int n){SetValue(n);}public void SetValue(int n){if (value != n){NumEventArgs e = new NumEventArgs(n);value = n;OnChangeNum(e);}}}public class EventAction{public static void Action(NumEventArgs e){System.Console.WriteLine("value : " + e.value);}}public class NumEventArgs : EventArgs{public int value;public NumEventArgs(int _value){this.value = _value;}}
C#总结(二)事件Event 介绍总结相关推荐
- 事件Event 介绍总结
最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...
- 事件根基event_base、事件循环event_loop、事件event、信号事件SignalEvent
一.event_base (一) libevent简介与浅谈event_base libevent实际上就是对底层select/poll/epoll等进行了封装,每个event_base都有一种&qu ...
- 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步
摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...
- js事件(Event)知识整理
鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemove 如果按下鼠标上的设备(左键,右键,滚轮--),则触发mousedow ...
- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- [数据库] Navicat for MySQL事件Event实现数据每日定期操作
在我们操作数据库过程中,通常会遇到一些某个时间点操作数据库的问题,例如: (1).每天凌晨12点对数据库进行定时备份,结算和汇总: (2).每天凌晨2点删除数据库前三天 ...
- Python 线程事件 Event - Python零基础入门教程
目录 一.Python 线程事件 Event 函数介绍 二.Python 线程事件 Event 原理 三.Python 线程事件 Event 使用 四.重点总结 五.猜你喜欢 零基础 Python 学 ...
- iframe关闭时触发事件_超详细的mysql数据库事件--定时任务介绍及日常管理
概述 由于最近在做某些日志表的清理工作,会用到定时任务,所以这里也简单介绍一下mysql如何用事件来实现定时任务. 后面会介绍两个日志表清理实现方案,一种是传统的定时delete,另一种会稍微复杂点, ...
- js事件Event对象(自定义事件对象 CustomEvent)
文章目录 一.参考 二.Event 接口介绍 2.1 事件分类 三. 创建过时Event不推荐 3.1 document.createEvent 3.1.1 语法`var event = docume ...
最新文章
- 一条推文卖出 290 万美元天价?网友:我竟是隐藏的富翁
- BZOJ4754 JSOI2016独特的树叶(哈希)
- 网页性能分析不完全指南
- 摄像头夜间拍摄画面有拖影_让客厅秒变健身房,OPPO智能电视R1+摄像头上手体验...
- 我的Go+语言初体验——(6)整型有理数数据类型
- jx8net一定在所有的方方面面都更坚强更勇敢了吧
- mysql xtrabackup 保护模式_MySQL Xtrabackup备份原理和实现细节
- [原创]深入理解C# 3.x的新特性(3):从Delegate、Anonymous Method到Lambda Expression
- STM32F103mini教程学习总结与心得(五)---->通用定时器
- 动态规划-----(思路详解)
- 手机销售网jsp程序设计
- 你要的Chrome插件都在这里了
- 使用Python和MySQL实现网上购物管理系统
- Visual studio系统找不到指定文件的解决办法
- 倡导低碳低成本出行,神州租车用实力说话
- 以地理国情调查任务为基础的地图矢量化流程研究
- conda的一个坑。channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch - https://mirro
- 使用python抓取App数据
- 用数据说话,Python就业前景分析
- 从勾股定理到立方公式的整数解