关于C# 委托(delegate)与事件(event)的用法及事例
C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用。有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床。
上面例子实际上包括2个类,一个是学生类(Student),一个是闹钟类(Ring)。此时,让我们仔细想想,当闹钟到点后如何通知学生呢?当然不要说,闹钟响了,学生能听到这样的话23333,现在是写程序,一切用程序说话。也就是说当时间到了,闹钟类里应该有个给学生发消息的方法(OnSendMessage()),学生类里会有处理这个消息方法(HandleEvent()),比如说起床。看似蛮对的,但是有一个问题,这不是实时通信程序,学生如何检测到闹钟发来的信息,从而去调用起床的方法呢?实际在程序中,我们是通过在闹钟类的发消息方法中调用学生类中的起床方法实现的。是不是有点乱了?那换句话说,就是当响铃这一事件被触发后,起床会自动发生。呃,不小心就把事件给说出来了,感觉自己有点啰嗦了。
那什么是委托,委托其实是一种编程技术,事件机制是委托这种技术的应用。简单的说,通过在声明个委托delegate,将HandleEvent()方法交给delegate,这样在闹钟类中就可以通过委托调用HandleEvent()方法了。
到这里有的朋友可能读懵了。不用担心,不懂可以先继续往下看。说下委托和事件各自的声明格式:
委托:[修饰符] delegate 返回类型 委托名(参数列表)
举例:
public delegate void RingHandler();
事件:[修饰符] event 委托名 事件名
举例:
public event RingHandler SendMessage;
根据上面的小例子,我们把代码实现,然后大家细细体会。
1、需要声明一个委托
public delegate void RingHandler();
需要注意2点,委托的声明在类外与类的声明并列。委托的返回类型和参数列表必须与需要被委托方法(HandleEvent())的返回类型和参数列表相同。
2、创建一个定义事件的类,即消息的发送方(Ring)。需要包含(1)与委托关联的事件(2)事件的触发方法
public delegate void RingHandler();//注意返回类型和参数列表与事件处理方法返回类型和参数列表一致
public class Ring
{
public event RingHandler SendMessage;//与委托关联的事件,此时不懂没关系,知道是个事件就行。
public void OnSendMessage()//事件触发时调用的方法
{
SendMessage();
}
}
3、定义一个将方法连接到接收事件的上的类(Student)。需要包含(1)事件处理方法(2)将事件与事件处理方法相关联
public class Student
{
public void HandleEvent()//事件处理方法
{
Console.WriteLine("该起床了");
}
public void Register(Ring ring)
{
ring.SendMessage += new RingHandler(HandleEvent);//此处注意事件注册或移除只能用+=/-=符号,不能用其他。括号里只需写上方法名即可
}
}
最后创建实例使程序运行,代码如下:
class Program
{
static void Main(string[] args)
{
Ring ring = new Ring();
Student student = new Student();
student.Register(ring); if(GetTime() == )//如果时间是6点,就触发响铃方法。GetTime()不给实现了。
{
ring.OnSendMessage();
}
}
}
总结一下,事件的使用简单就是三点:(1)定义事件(2)注册事件(3)触发事件。大概就是这样使用的,但是在实际工作中,通常我们只需要完成事件处理方法中的代码,不必关心事件和委托的定义。
关于C# 委托(delegate)与事件(event)的用法及事例的更多相关文章
- 重温委托(delegate)和事件(event)
1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- (转)C#中的委托(Delegate)和事件(Event)
转自:http://blog.chinaunix.net/uid-576762-id-2733751.html 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...
- 【温故知新】c#事件event
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- C#:委托(delegate)和事件(event) (转)
委托(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同 ...
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- 【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)
[学习资料] <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.bai ...
- C#:代表(delegate)和事件(event)
代表(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同 ...
随机推荐
- cnVCL的安装
cnVCL是cnpack组件中的不可视组件库,里面包含很多有用的组件,网址:http://www.cnpack.org/showdetail.php?id=739&lang=zh-cn 安装步 ...
- Linux磁盘及文件系统(三)Linux文件系统
一.文件系统的组成 Linux常见的文件系统类型有ReiserFS,ext2,ext3,ext4,vfat,XFS等,文件系统是对一个存储设备上数据和元数据进行组织的机制.他的最终目的是把大量数据有组 ...
- ubuntu下apache2使用的简单总结
一. 修改apache2原80端口为90端口 1. 修改/etc/apache2/ports.conf, 将端口80改为90,443,改为444 2. 修改/etc/apache2/sites ...
- Protobuf底层存储原理
参考官网, 序列化原理 底层二进制存储 message Test1 { optional int32 a = 1; } 并设置为a=150,序列化到一个文件中,查看文件,得到下面的二进制: 08 96 ...
- QuantLib 金融计算——基本组件之 InterestRate 类
目录 QuantLib 金融计算--基本组件之 InterestRate 类 InterestRate 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. Qua ...
- 在Eclipse平台中,搭建SpringBoot开发环境
1.查看eclipse版本号,Help->About Eclipse IDE 2.下载对应版本的STS插件 下载地址:https://spring.io/tools3/sts/all(注意版本对 ...
- Unity脚本生命周期与执行顺序
文章目录 脚本生命周期 MonoBehavior生命周期图 脚本执行顺序 自定义执行顺序 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码.必须绑定在游戏对象上才能开始它 ...
- Python turtle库学习笔记
1.简介 Python的turtle库的易操作,对初学者十分友好.对于初学者来说,刚学编程没多久可以写出许多有趣的可视化东西,这是对学习编程极大的鼓舞,可以树立对编程学习的信心.当然turtle本身也 ...
- 厉害了,七牛云 CEO 来讲架构了!
说起许式伟,你应该不陌生,他是七牛云的CEO,ECUG 社区发起人,国内 Go 语言圈的领军人物,曾就职于金山.盛大,有超过 10 年的搜索和分布式存储相关技术的研发经验. 他的个人经历颇为传奇,大学 ...
- 【性能测试】:关于测试F5负载均衡的问题
在压测过程中,前置分发机的请求分发策略有多种,轮询,随机,DNS均衡,最小连接数等 问题出现的前提:因测试的一个系统对用户安全性校验较强,例如做交易之前,需要验证用户安全信息等 问题出现的现象:当lo ...