委托与事件

  首先多谢网上的大牛们无私地分享自己的经验,让我这样的小鸟能站在巨人的肩膀上不断前进!

  参考网址:http://www.knowsky.com/395937.html(参考1)

                http://hi.baidu.com/zhangguilin/blog/item/9d34dc17a088ff0ac83d6d08.html(参考2)

                http://www.chinaz.com/program/2009/1014/94676.shtml(参考3)

  以下是我的总结:

委托                                                                    

  msdn把委托描述为面向对象、类型安全、可实现多播的函数指针。

  1、面向对象:.net把委托(函数指针)定义为类型,具体的类名为委托名称,并且存在继承关系:自定义委托<--System.MulticastDelegate<--System.Delegate。

  2、类型安全:委托对象中有_target、_methodPtr、_methodPtrAux三个变量。当委托实例指向某个实例方法时,_target指向实例对象,_methodPtr指向实例方法的JIT STUB(如果经过了JIT编译,就直接指向实例方法的内存地址),_methodPtAux为0;当委托实例指向某个静态方法时,_target指向委托实例本身,_methodPtr指向STUB(一小段代码,用于让CLR把_target设为null),_methodPtAux指向静态方法的内存地址。从上面可以看出委托实例中不仅保存了函数的地址,还保存了函数所在类的实例,相反看一下C++的函数指针只是保存函数的地址,而不管实例函数属于哪一个类。

  3、可实现多播:通过+=、—=添加(移除)函数指针。实例化委托时,MyDelegate d = new MyDelegate(my)为单播形式;MyDelegate d += new MyDelegate(my),d += new MyDelegate(my1)为多播形式。添加(移除)函数指针实际调用了MulticastDelegate的CombineImpl方法把函数指针添加到_invocationList(类型为object数组),可以同过委托实例.GetInvocationList()方法获取。

  注意:在多播情况,假如某些函数有返回值,那么要使用下列方式来获取返回值。

foreach(var item in 委托实例.GetInvocationList())
{
item();
}

并非像(参考2)里面说的多播中的函数不能有返回值。

 

事件                               

  事件跟委托有许多相似之处,经常不知道使用哪一个,这里着重说明两者的区别。这里参考了.NET委托: 一个C#睡前故事,这个例子描述得十分清楚。

  下面是自己的总结。

  委托对象定义为public后不仅所属类内部能调用,类外部也能调用;事件不管即使定义为public,也只能在所属类的内部触发,而类外部只能订阅不能触发事件。


总结                             

  使用事件可以降低耦合度,事件的触发与事件的订阅分离,让感兴趣的对象订阅某个对象的全部或部分事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适配器简介

STL 适配器分为 函数对象适配器、迭代器适配器 和 容器适配器 3种&#xff0c;分别完成对应的类型转换。 举例子容易&#xff0c;比如电源插座&#xff0c;3个头的插头插不进两个头的插座&#xff0c;就需要一个适配器。 1、函数适配器&#xff1a; 在stl程序里&#xff0c;有的…

他让全世界凶手睡不着觉,现实版福尔摩斯,退休了4次又被拽回来工作,无敌实在是太寂寞了~...

全世界只有3.14 % 的人关注了爆炸吧知识今天要说一位最近在中国圈粉无数萌萌哒老爷爷他是《挑战不可能》里的李博士也是世界上最牛逼的刑侦鉴识专家DrHenryLee李昌钰人称现实版福尔摩斯他是全球身价最高的鉴识专家之一据说工作酬劳是10000美元/时如果哪个案子他都破不了那这个c…

集成Dapr的 Azure 容器应用

微软在 Ignite 2021 大会上发布了预览版的Azure Container Apps&#xff0c;这是一个完全托管的无服务器容器运行时&#xff0c;用于大规模构建和运行现代应用程序。从2021 年 11 月 2 日起&#xff0c;Azure 容器应用程序可在公共预览中使用。虽在服务到达 GA 之前&#xff0c…

jsp iframe嵌入php,jsp嵌套iframe从iframe中表单提交并传值到外层_html/css_WEB-ITnose

今天因需求迭代 更改元来代码 遇到了这么个问题就是想在 iframe中提交后进行整个页面的跳转 并把iframe中的值传到外层jsp大概就是这个样子外层 a.jsp内层 b.jsp于是想当然的开始码代码打算用js进行赋值 在b.jsp中 写个js$(#d).val();虽然能获取到隐藏域的值 但 外层的值并没有…

浅谈SQL注入风险 - 一个Login拿下Server(转)

前两天&#xff0c;带着学生们学习了简单的ASP.NET MVC&#xff0c;通过ADO.NET方式连接数据库&#xff0c;实现增删改查。 可能有一部分学生提前预习过&#xff0c;在我写登录SQL的时候&#xff0c;他们鄙视我说&#xff1a;“老师你这SQL有注入&#xff0c;随便都能登录了。不…

java笔试面试经典问题

java面试笔试题大汇总 JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象&#xff1a; 抽象就是忽略一个主题中与当前目标无关的那些方面&#xff0c;以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题&#xff0c;而只是选择其中的一部分&#xff0…

设计模式建议学习顺序

学习顺序设计模式常用程度适用层次引入时机结构复杂度变化实现体现的原则1Factory Method很常用代码级编码时简单子类的实例化对象的创建工作延迟到子类开闭原则2Singleton很常用代码级、应用级设计时、编码时简单唯一实例封装对象产生的个数 3Facade很常用应用级、构架级设计时…

MSFT Outlook VBA处理新邮件的方法

俺们有两个邮箱&#xff0c;1个外部的邮箱1&#xff08;outlook&#xff09;&#xff0c;1个内部邮箱0&#xff08;lotus notes&#xff09;。想要outlook邮箱收到新邮件之后判断一下subject的内容&#xff0c;如果是"kkk:"开头&#xff0c;则将"kkk:"后面…

炸了!中国学者首次被Science撤稿,与之前首次被Nature撤稿的教授来自同一所大学……...

全世界只有3.14 % 的人关注了爆炸吧知识两次撤稿并非学术造假&#xff1f;国庆假期结束的第一天&#xff0c;Science杂志将中国地质大学宋怀兵副教授两个月前发表的文章进行了撤稿处理。这也是新中国建国以来&#xff0c;首次被Science撤稿的论文。其实早在8月&#xff0c;Scie…

linux 查询oracle情况,在Linux下使用SQLPlus查看Oracle数据库表空间及使用率

在Linux下进入SQLPlus&#xff0c;# su – oracle$ sqlplus / as sysdbaSQL>查看一个表空间所对应的数据文件SQL>select file_name from dba_data_fileswhere tablespace_name’BING’;FILE_NAME———————————————————————————————————…

如何编写干净流畅的Web API测试

前言当我们为Web API编写测试用例时&#xff0c;代码基本是这样的&#xff1a;public class UnitTest1 {private readonly TestServer _server;private readonly HttpClient _client;public UnitTest1(){// Arrange_server new TestServer(new WebHostBuilder().UseStartup<…

SFB2015 多SIP域

SFB2015 多SIP域最近公司有打算要安装最新的SFB2015作为一个SFB小白 在通读了官方安装文章之后竟然磕磕绊绊的安装成功&#xff0c;客户端登录也是成功的&#xff0c;下面就有一个十分蛋疼的问题 公司内外网域名不一致虽然在进行拓扑准备的时候进行了多SIP域的准备&#xff0c;…

SWFUpload V2.2.0 说明文档

http://leeon.me/upload/other/swfupload.html#overview

java经典问题总结

一、考虑用静态工厂方法代替构造器&#xff1a; 构造器是创建一个对象实例最基本也最通用的方法&#xff0c;大部分开发者在使用某个class的时候&#xff0c;首先需要考虑的就是如何构造和初始化一个对象示例&#xff0c;而构造的方式首先考虑到的就是通过构造函数来完成&#…

中国25个最“吓人”地名,看完都被吓笑了!

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;中学地理课中国人起名字&#xff0c;是很有讲究的。不管是起人名&#xff0c;还是起地名&#xff0c;和作诗差不多&#xff0c;都是在营造一个意境。就拿北京来说吧&#xff0c;比如颐和园&#xff0c;听着端庄&#xff…

C语言控制流对应的汇编语句

最近在看《深入理解计算机系统》&#xff0c;发现汇编挺有趣。 1.条件分支&#xff1a;if语句 下面是一个简单的ifelse函数&#xff1a; int absdiff(int x, int y) {if (x < y)return y - x;elsereturn x - y; } 对这个程序使用如下命令&#xff0c;得到汇编程序&#xff0…

C# 显式接口成员实现

如果类实现两个接口&#xff0c;并且这两个接口包含具有相同签名的成员&#xff0c;那么在类中实现该成员将导致两个接口都使用该成员作为它们的实现。然而&#xff0c;如果两个接口成员实现不同的功能&#xff0c;则可能会导致其中一个接口的实现不正确或两个接口的实现都不正…

oracle 加密怎么解密,oracle加密encrypt,解密decrypt,

oracle加密encrypt,解密decrypt&#xff0c;目录oracle加密encrypt,解密decrypt加密解密oracle加密encrypt,解密decrypt有的oracle版本没有加解密函数&#xff0c;以下操作可以手动添加oracle数据使用加密解密&#xff0c;我们首先要先赋予dbms_crypto权限给用户。grant execut…

C语言可变参数宏

岁月不饶人&#xff0c;这年纪大了记忆力真是差了很多。今天写程序需要用到可变参数的宏&#xff0c;可是忘了怎么写&#xff0c;这倒也没什么&#xff0c;因为我一向是不记忆这些语法细节的&#xff0c;反正我知道程序里有个地方用到了这种技巧&#xff0c;但是可悲的是我忘了…

没有数学天赋是一种什么体验?

全世界只有3.14 % 的人关注了爆炸吧知识虽然我不懂但我热爱数学♪没有数学天赋是一种什么体验&#xff1f;1 看不懂懵逼矩阵2 小学数学不及格&#xff0c;找了个纹身店&#xff0c;问老板纹个九九乘法口诀多少钱。老板说了一个价钱&#xff0c;后来因算不出要存多少天早餐钱而作…