还弄不明白【委托和事件】么?看这一篇就足够了!!!
这两个概念长时间不用了,今天看到CAD二次开发中用到了自定义事件,有点迷糊了,索性再整理一下加深印象!
一说到委托和事件,他们总是绑定在一起的不可分割!可能你会说啊!这有什么用啊?尽管你没有在意,但是只要你编写C#程序,就会潜移默化的使用委托和事件,这也是多态的一种表现形式。有关多态,我们后续再说。本节力求通俗易懂的让你明白委托和事件的关系,并能自己去编写,即使不去编写也能看懂C#中的代码。
目录
1.委托:
1.1使用委托的步骤:
1.2程序应用:
①声明委托
②根据委托定义方法
③定义委托变量
④调用委托变量
⑤将委托变量和具体的方法关联挂载
1.3程序效果:
1.4补充:
2.事件:
2.1使用事件的步骤:
2.2程序应用:
2.2.1声明委托:
2.2.2根据声明的委托定义具体的方法:
2.2.3添加事件:
2.2.4使用事件:
2.2.5将事件与具体的方法挂载:
2.3程序效果:
3.事件与委托总结:
4.看看微软自定义和CAD二次开发的事件吧:
5.总结:
1.委托:
比喻:委托(delegate)就是代理、中介,比如你自己因为某种原因办不了的事,就需要中介去做!
在程序中委托可以看成是一种数据类型【你可以把他看成你的自定义类】,他可以定义变量。但是他是一种特殊的变量,因为这个变量只能接收方法。
1.1使用委托的步骤:
总结下使用委托中主要有五个步骤:
①声明委托【类似抽象方法的声明,没有具体的方法体】
②根据声明的委托定义具体的方法
③定义委托变量
④调用委托
⑤将委托变量和具体的方法关联挂载
1.2程序应用:
我目前有个需求,就是想实现窗体之间的双向通信。
基本想法如下:通过窗体A创建一个窗体B,让A发送的消息在B中接收。在B中的消息也能发送到A中。很简单对吧,熟悉C#的同学会说,直接调用实例就好了啊或者静态变量存一下啊!先说实例那个,其实A的消息给B是可以的,因为B就是A创建的。但是反过来就不行了。再说静态方法,一个程序中如果静态方法多了,一是不好找二是也会影响一丢丢的性能(暂且不管,因为委托更大的作用还在后头,只是用这个例子说明)。
程序界面:
form1是我的主窗体(form1),form2是我创建的子窗体(frmSub1)。先实现子窗体向主窗体发送消息的功能。
①声明委托
首先在form1窗体中声明委托【返回值类型和参数个数及类型是要与将来关联的方法一致的】,因为我只展示信息,所以设置为void没有问题。信息本身是字符串,所以参数string可以的。
委托原则上定义在类的外面,和类本身平级
②根据委托定义方法
在form1主窗体中定义方法用来展示子窗体传递的信息。(方法的返回值和参数个数类型要和声明委托的一致)
③定义委托变量
切换到子窗体,在frmSub1中定义委托变量(直接声明就好),这里就能看出委托和类一样,能作为类型去定义变量。
④调用委托变量
在frmSub1中的发送按钮事件中调用委托变量,并传入具体的内容。这里你可以想想,子窗体压根不知道父窗体要用什么方法,反正我就用你定义的委托类型创建的变量就好了,你要什么参数我给你,至于什么方法去和他关联,我就管不着了。
⑤将委托变量和具体的方法关联挂载
再次返回主窗体form1中,将子窗体frmSub1中的委托变量和form1中的方法关联一下。就可以实现了。
1.3程序效果:
那么反过来主窗体给子窗体通信我相信大家可以自己尝试了。
注意:
因为委托基本都是在不同的文件之间进行的,所以使用委托的五个步骤基本是分开的,很多人刚开始分不清在哪里定义那些,我就把我的方式说一下吧,其实用多了懂原理了就不用刻意记了。
①声明委托一般在父级,在哪无所谓,因为public,但是要记住要好找,后期维护方便
②根据委托定义方法,一般就是哪里用这个方法,就定义在哪里。
③定义委托变量的位置要和委托方法定义的位置分开,因为你要通过委托变量调用具体方法。
④在定义委托变量的地方去使用委托变量。
⑤关联还是通过实例对象进行关联,只要能将委托变量和具体方法挂上就好。
1.4补充:
其实用了委托你就可以发现委托挂载的方法可以不止一个,用“+=”或者“=”挂载,用“-=”卸载方法。
也不用new 委托,直接将方法名放上就行了(心里要明白)。
比如:
2.事件:
说完了委托,那么事件又是什么呢?
事件就是对象在外界的“刺激”下而对外界提供的一种消息机制。
其实事件就是对委托的进一步封装,因为委托暴露了太多的权限,用事件对他进行限制(比如什么能改,什么不能改)。
我的理解就是:事件就是对正常委托进行了限制的委托。
事件中你要明白几个概念:
发送者:即对象本身,当本身状态发生改变的时候,事件触发并通知事件的接收者。
接收者:用来处理事件的,发送者发送事件后会自动执行的内容。
2.1使用事件的步骤:
使用事件也是一样五个步骤:
①声明委托
②根据声明的委托定义具体的方法
③添加事件
④使用事件
⑤将事件与具体的方法挂载
2.2程序应用:
如果刚才的需求用事件实现是如何呢?
2.2.1声明委托:
和委托一样在主窗体form1中声明一个委托:
2.2.2根据声明的委托定义具体的方法:
在主窗体form1中添加一个方法(和委托要求一样)
2.2.3添加事件:
在子窗体frmSub1定义事件:
可以发现这个定义事件就是委托的定义委托变量加了个event标识符。
2.2.4使用事件:
在子窗体frmSub1发送按钮中使用定义的事件(和委托一样)
2.2.5将事件与具体的方法挂载:
再次回到主窗体form1将事件与具体方法挂载。
注意:这里只能用+=,不能用=
这里就是对委托进行的限制,防止你覆盖掉原来挂载的方法,你自己后定义的方法只能+=或-=,而不能直接覆盖。
试想如果让覆盖,那么C#系统定义好的可能就因为你的误操作都没了!!!
2.3程序效果:
可以发现与委托是一样的。
3.事件与委托总结:
前面说了这么多还是做个简短的汇总:
事件就是对委托进行进一步的封装,对委托强大的对外开放的权限进行一个设定。
事件主要对委托起到一个保护作用,其本质还是委托。
事件对某一个对象本身来说是私有的,因此只能通过+=和-=方式赋值。
4.看看微软自定义和CAD二次开发的事件吧:
看到这里了,相信你已经对委托和事件已经有了一个较为全面的认识了,接下来看看系统自定义的吧。
找到一个微软定义的按钮事件,click就是定义的一个事件。
进一步找,EventHandler就是一个委托。再继续
可以看到EventHandler真的是一个委托。
this.btnSend_click是和委托相关联的方法,看一下这个方法参数返回类型是不是和委托定义的一样?【所以当你只删除了这个方法的时候,在运行程序,ide会报错就是这个原因,因为你把事件挂载的方法实体删掉了,编译器根据挂载的方法名找不到实体方法了】
看到这里你就恍然大明白了吧?其实事件挂载也可以不必new个委托,直接放也是可以的。
这两种方法是等效的。
我们在看一个CAD二次开发中的委托吧?
文档说这个CurveSnap捕捉是AddObjectSnapInfo的委托,那我们来进一步的看看是不是?
ApplyToEntityType第二个参数就相当于声明委托变量了。
可以看到delegate就是委托声明,并且方法返回值和参数类型和个数是一致的。在回头看那个CurveSnap方法不就是根据委托定义的方法么?将方法名放入ApplyToEntityType参数中就是实现了委托变量和方法的关联。
再来看最后一个例子:
CAD二次开发中鼠标停留显示需要添加鼠标事件。
不难分析出,PointMonitor就是在Editor类中声明的事件,而PointMonitorEventHandler就是一个委托,ed_PointMonitor就是与这个委托相关联的方法!依次看图!
5.总结:
相信看到最后你一定对委托和事件有了一个十分深入的了解了。欢迎大家留下宝贵意见。关于面向对象其他内容后续我会陆续总结,欢迎大家关注!
还弄不明白【委托和事件】么?看这一篇就足够了!!!相关推荐
- 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!
原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...
- 趣评行业 | 第十期:区块链大事件,看这一篇就够了!
摘要:本行业报告共分为政务.医疗.金融.溯源.能源电力.数字雄安等板块,围绕过去一个月内区块链行业发生的大事件,并从区块链体系的价值.市场要素.共识机制等方面展开深入评价,探寻"价值互联时代 ...
- 还在为HttpUtils怎么写而烦恼吗?看这一篇就足够了
文章目录 概述 关于Http的基本标准 Http的四要素 四要素举例 最常见的get请求 普通字符串的post请求 普通form表单的post请求 multi-form(多表单)的post请求 Htt ...
- OMG!步步图解让你明白Spring循环依赖!看这一篇就够了
前言 本份文档内容涵盖: Java.MyBatis.ZooKeeper.Dubbo.Elasticsearch.Memcached.Redis.MySQL. Spring.Spring Boot.Sp ...
- Java面试官:步步图解让你明白Spring循环依赖!看完这篇彻底明白了
前言 不知道你们发现没有,在很多互联网公司基本上都是80后,90后居多,很少还有超过40岁的程序员.可能很多人心里都有一个疑问,那就是这些40多岁的程序员都干嘛去了呢?创业显然只是极少数的人,至于管理 ...
- js中的事件委托或是事件代理详解(转载)
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
- javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。...
2018年12月13日更新 <!DOCTYPE html> <html lang="en"> <head><meta charset=&q ...
- js事件委托或事件代理
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
- [C#]委托和事件(讲解的非常不错)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
最新文章
- 没错,老板让我写个 BUG!
- Python之配置日志模块logging
- hdu 1528+hdu 1962(最小覆盖)
- 今年新增院士中,最年轻的是他
- SpringBoot入坑-请求参数传递
- Hive External Table of Doris(详细)
- jfreechart柱状图java mysql_时序时空数据库MySQL再升级,兼容MySQL协议
- 慕课python七月_【慕课有约】七月老师:关于小程序的那些事
- rx580默认频率1150_不到1300元的RX580 显卡能买吗?!迪兰 RX580 2048SP 4G X-Serial 开箱测试...
- 什么是上行带宽? 什么是下行带宽?
- ubuntu18之wine
- CRC32、murmur32、SDBM32碰撞实验数据对比
- 海马玩模拟器 v0.7.2 官方版
- Hybird A*算法
- gnuplot绘制xxx.plt文件生成图形
- python培训班课程大纲_Python课程大纲
- 上班被监控屏幕和摄像头,拒绝就直接开除,员工起诉公司获赔52万元
- 心理学导论--- 1 心理学在搞什么
- AAA认证 设置域 PPP认证 AAA默认域认证
- 合并报表软件工具怎么用?
热门文章
- Pandas处理时间序列数据的20个关键知识点
- 关于监控的那些事,你有必要了解一下
- 关于js不生效的问题
- 天数智芯亮相“2019 世界半导体大会”,宣布国内首款GPGPU芯片推出时间表
- android横屏显示布局,Android Develop:横屏布局
- 【愚公系列】2022年11月 微信小程序-优购电商项目-商品支付页面
- 重庆城市交通规划数字化应用场景
- 【iOS_GitHub】跑马灯/滚动文字条(类似于菜鸟/京东/支付宝/聚划算/网商银行等app的跑马灯功能)
- 达梦服务器本地归档最多可以设置几个,DAE认证考核参考考试
- 如何正确阅读互联网人的简历呢?