仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 960|回复: 9
打印 上一主题 下一主题

[学习教程] NET网页编程之C#托付进修(二):托付的实质

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
可怜的程序员,还是逃不出移植的命运!上一节我们已和人人分享了我了解的——C#中为何必要托付,上一节中复杂先容了下托付是甚么和托付复杂的使用的,在这节中将对托付做进一步的先容的,本节次要对委实质和托付链举行会商。

1、托付的实质
平常我们很简单利用托付——用C#delegate关头字界说托付,再用new操纵符机关托付实例,然后经由过程挪用托付实例来挪用回调办法(就是用一个了托付工具的变量来取代办法名,这句话假如刚打仗的人欠好了解的话,这里给个例子:MyDelegatemydelegate=newMydelegate(obj.mymethod),MyDelegate是界说的一个托付,假定界说的是没有参数的,然后挪用托付实例是如许的——mydelegate(),人人能够发明此时挪用托付和挪用办法的体例是千篇一律的,假如没有看后面mydelegate是个托付范例,人人城市以为这是间接挪用一个办法,而不是挪用托付实例,经由过程这个例子人人应当很简单分明了这句话了吧——用一个托付工具的变量来取代办法名),信任经由过程括号内的解说后,信任人人又会对托付有进一步的了解的——托付就是办法的取代品,托付变量此时着办法名,人人能够复杂了解托付是办法的一个“绰号”。

后面的都先容了托付的一些利用和了解的,如今就让我我们来进一步看看编译器和CLR在面前对我们用delegate关头字界说的托付范例做了些甚么事变的,前一个专题中我和人人说过托付是一个类,这么是有依据的,由于我们在IDE中界说一个托付范例时,终极是经由过程编译器将界说的代码转化为两头言语IL,然后再实行两头言语中的代码来转化为本机代码的,以是在VisualStudio中编写的代码只是一个包装罢了,真真程序实行的是两头言语中的代码的。如今就看看编译器把我们界说的托付范例转化为何样的两头言语代码的。

当我们在类中像上面如许界说一个托付时:
publicdelegatevoidDelegateTest(intparm);

编译器把我们界说的托付范例编译成一个上面如许的类:
PublicclassDelegateTest:System.MulticastDelegate
{
publicDelegateTest(Objectobject,IntPtrmethod);
publicvirtualVoidInvoke(int32parm);
publicvirtualIAsyncResultBeginInvoke(Int32parm,AsyncCallbackcallback,Objectobject);
publicvirtualvoidEndInvoke(IAsyncResultresult);
}

从两头言语的代码就能够很分明的看出我们在代码中写的托付,关于两头言语来讲就是一个类,该类承继于FCL中界说的Systme.MulticastDelegate范例,一切托付范例都派生于MulticastDelegate,该类中还界说了四个办法,一个机关函数,Invoke办法,另有就是两个异步办法BeginInvoke和EndInvoke办法,关于这两个异步办法,人人能够检察我博客中的线程系列。人人能够用ILDasm.exe工具往检察托付天生的两头代码,上面我截的一个图(从我们界说的DelegateTest的后面的图标和我们主程序传送Program的图标是一样的,但是Program是一个类,很分明界说的托付DelegateTes也是一个类的):


因为一切托付范例都是承继于MulticastDelegate,MulticastDelegate又承继于Delegate,以是托付范例承继了MulticastDelegate的字段、属性和办法,在这些成员中,有三个非大众字段与前面专题要先容的托付链有关,以是在这里先列出来的:
字段范例注释_targetSystem.Object当托付工具包装的是一个静态办法时,这个字段为null,当托付工具包装一个实例办法时,这个字段援用的是办法地点的类的工具_methodPtrSystem.IntPtr一个外部的整数,能够以为是办法句柄,标识着要挪用的办法_invocationListSystem.Object该字段一般为null,当机关一个托付链(多播托付)时,才援用一个托付数组。详细下一部分解说。
年夜部分人大概会有这么个疑问,既然长短大众字段,以是在MSDN上是看不到的,那我是怎样晓得有这三个字段的呢?人人能够经由过程Reflector工具是反编译检察源码,Multicastdelegate类经由过程MSDN查找能够晓得该类的定名空间和程序集,如许就能够更具程序集和定名空间用Reflector工具检察Multicastdelegate类的源码,上面是我用Reflector这个工具检察到的源码截图:


从截图中能够看出MulticastDelegate类中只要两个字段,却没有后面表格中列出的_methodPtr和_target字段的,这两个字段是界说在Delegate类中,人人利用Reflector工具来检察的,这里就细贴图了,文章最初会给出Reflector工具下载链接的。

托付工具就是一个包装器,包装了一个办法和挪用该办法时要操纵的工具,比方,实行上面的代码时:

publicclassProgram
{
//声明一个托付范例,它的实例援用一个办法
//该办法归去一个int参数,前往void范例
publicdelegatevoidDelegateTest(intparm);

publicstaticvoidMain(string[]args)
{
//用静态办法来实例化托付
DelegateTestdtstatic=newDelegateTest(Program.method1);

//用实例办法来实例化托付
DelegateTestdtinstance=newDelegateTest(newProgram().method2);
}
privatestaticvoidmethod1(intparm)
{
Console.WriteLine("挪用的是静态办法,参数值为:"+parm);
}

privatevoidmethod2(intparm)
{
Console.WriteLine("挪用的是实例办法,参数值为:"+parm);
}
}

代码中dtstatic和dtinstance变量援用了初始化好的DelegateTest托付工具,此时这两个托付工具的下面列出来的三个字段初始化情形以下图:


2、总结
本专题从两头言语的角度往具体剖析界说的托付范例经编译器转化后的的两头言语是如何来注释一个托付范例的,失掉的结论是——托付实践上是一个类,该类派生于MulticastDelegate类,且承继了该类的_target,_methodPtr和_invocationList这三个字段,当我们初始化一个托付工具时,此时就会先初始化这三个字段,关于包装实例办法和静态办法的托付,初始化这三个字段也有所纷歧样,在下面的截图中也所表现,这里援用了一个很主要的字段——_invocationList(即托付实例的挪用列表),关于托付工具包装一个办法时,该字段为null,假如托付工具要包装多个办法时,此时_invocationList字段就会被初始化为援用一个托付工具的数组(就是指向托付工具的一个汇合),详细这方面的内容将鄙人一专题先容托付链中为人人具体先容。到这里,本专题的内容也停止了,但愿经由过程本专题,人人能够更进一步的了解C#中的托付。

Reflector工具的下载地点:http://files.cnblogs.com/zhili/Reflector.zip。我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了?
admin 该用户已被删除
沙发
发表于 2015-1-18 13:01:03 | 只看该作者
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
山那边是海 该用户已被删除
板凳
发表于 2015-1-18 13:01:03 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
飘飘悠悠 该用户已被删除
地板
发表于 2015-1-26 14:06:49 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
再见西城 该用户已被删除
5#
发表于 2015-2-4 20:05:59 | 只看该作者
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
第二个灵魂 该用户已被删除
6#
发表于 2015-2-10 06:40:14 | 只看该作者
ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-1 02:44:27 | 只看该作者
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
若天明 该用户已被删除
8#
发表于 2015-3-10 12:30:12 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
兰色精灵 该用户已被删除
9#
发表于 2015-3-17 07:11:13 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
活着的死人 该用户已被删除
10#
发表于 2015-3-24 02:14:30 | 只看该作者
在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 05:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表