仓酷云

标题: ASP.NET编程:[你必需晓得的.NET]第二十三回:咀嚼细节,深切.NET的范例机关器仓酷云 ... [打印本页]

作者: 再见西城    时间: 2015-1-18 11:23
标题: ASP.NET编程:[你必需晓得的.NET]第二十三回:咀嚼细节,深切.NET的范例机关器仓酷云 ...
一般的指的.net就是跟net网页编程相对的那种,主要是做企业级应用的。你如果想学这个,主要就是学C#和数据库。(ASP.NET好像很重要的,应该也要学的,ASP.NET上好像可以结合VB和C#等多种语言,但是微软主推C#)系列文章目次索引:《你必需晓得的.NET
ASP.NET编程:[你必需晓得的.NET]第二十三回:咀嚼细节,深切.NET的范例机关器仓酷云 ...
登录/注册后可看大图

<br>说在,开篇之前明天Artech兄在《关于TypeInitializer和BeforeFieldInit的成绩,看看人人可否给出准确的注释》一文中让我们熟悉了一个关于范例机关器挪用实行的风趣示例,个中也响应提出了一些关于beforefieldinit关于范例机关器挪用机会的切磋,关于我们很好的了解范例机关器给出了一个很好的使用理论体验。
熟悉范例机关器,熟悉beforefieldinit,更深切存眷CLR实行机理,咀嚼细节之美。1弁言明天Artech兄在《关于TypeInitializer和BeforeFieldInit的成绩,看看人人可否给出准确的注释》一文中让我们熟悉了一个关于范例机关器挪用实行的风趣示例,个中也响应提出了一些关于beforefieldinit关于范例机关器挪用机会的切磋,关于我们很好的了解范例机关器给出了一个很好的使用理论体验。
作为增补,本文但愿从基本入手下手再层层深切,把《关于TypeInitializer和BeforeFieldInit的成绩,看看人人可否给出准确的注释》一文中没有注释的观点和道理,举行需要的增补,比方更周全的熟悉范例机关器,熟悉BeforeFieldInit。并在此基本上,切磋一点关于范例机关器的理论使用,同时代看可以回覆个中示例运转的了局。
空话少说,我们入手下手。
2熟悉对象机关器和范例机关器
在.NET中,一个类的初始化历程是在机关器中举行的。而且依据机关成员的范例,分为范例机关器(.cctor)和对象机关器(.ctor),个中.cctor和.ctor为两者在IL代码中的指令暗示。.cctor不克不及被间接挪用,其挪用划定规矩恰是本文欲加论述的重点,详见后文的剖析;而.ctor会在范例实例化时被主动挪用。
基于对范例机关器的切磋,我们有需要起首完成一个复杂的类界说,个中包含一般的机关器和静态机关器,比方
  1. //Release:code01,2008/11/02
复制代码
  1. //Author:Anytao,http://www.anytao.com
复制代码
  1. publicclassUser
复制代码
  1. {
复制代码
  1. staticUser()
复制代码
  1. {
复制代码
  1. message="Initializeinstaticconstructor.";
复制代码
  1. }
复制代码
  1. [/code][code]publicUser()
复制代码
  1. //Author:Anytao,http://www.anytao.com0
复制代码
  1. //Author:Anytao,http://www.anytao.com1
复制代码
  1. //Author:Anytao,http://www.anytao.com2
复制代码
  1. //Author:Anytao,http://www.anytao.com3
复制代码
  1. //Author:Anytao,http://www.anytao.com4
复制代码
  1. {
复制代码
  1. //Author:Anytao,http://www.anytao.com6
复制代码
  1. //Author:Anytao,http://www.anytao.com7
复制代码
  1. //Author:Anytao,http://www.anytao.com2
复制代码
  1. //Author:Anytao,http://www.anytao.com3
复制代码
  1. publicclassUser0
复制代码
  1. //Author:Anytao,http://www.anytao.com3
复制代码
  1. publicclassUser2
复制代码
  1. //Author:Anytao,http://www.anytao.com3
复制代码
  1. publicclassUser4
复制代码
我们将上述代码利用ILDasm.exe工具反编译为IL代码,能够很便利的找到响应的范例机关器和对象机关器的影子,如图
ASP.NET编程:[你必需晓得的.NET]第二十三回:咀嚼细节,深切.NET的范例机关器仓酷云 ...
登录/注册后可看大图

<br>
然后,我们复杂的来懂得一下对象机关器和范例机关器的观点。

在天生的IL代码中将能够看到对应的ctor,范例实例化时会实行对应的机关器举行范例初始化的操纵。
关于实例化的历程,计划到对照庞大的实行按次,依照范例基本条理举行初始化的历程能够参阅《你必需晓得的.NET》7.8节“动态之间:静态和非静态”一文中有具体的先容和剖析,本文中将不做过量切磋。
本文的重点以考查范例机关器为主,以是在此不举行过量切磋。

用于实行对静态成员的初始化,在.NET中,范例在两种情形下会产生对.cctor的挪用:

  1. publicclassUser5
复制代码
  1. publicclassUser6
复制代码
  1. publicclassUser7
复制代码
  1. publicclassUser8
复制代码
  1. publicclassUser9
复制代码
  1. {0
复制代码
  1. {1
复制代码
  1. {2
复制代码
  1. {3
复制代码
  1. publicclassUser5
复制代码
  1. publicclassUser6
复制代码
  1. publicclassUser7
复制代码
  1. {7
复制代码
  1. publicclassUser9
复制代码
  1. {0
复制代码
  1. {1
复制代码
  1. staticUser()1
复制代码
  1. staticUser()2
复制代码
  1. staticUser()3
复制代码
  1. staticUser()4
复制代码
  1. staticUser()5
复制代码
  1. {3
复制代码
同时,我们必需明白一些静态机关函数的基础划定规矩,包含:

3深切实行历程
由于范例机关器自己的特性,在必定水平上决意了.cctor的挪用机会并不是是一个断定的观点。由于范例机关器都是private的,用户不克不及显式挪用范例机关器。以是关于范例机关器的实行机会成绩在.NET中次要包含两种计划:

两者的实行不同次要表现在是不是为范例完成了显式的静态机关函数,假如完成了显式的静态机关函数,则依照precise体例实行;假如没有完成显式的静态机关函数,则依照beforefieldinit体例实行。
为了说分明范例机关器的实行情形,我们起首在观点上必需明白一个条件,那就是precise的语义明白了.cctor的挪用和挪用存取静态成员的机会存在准确的干系,以是换句话说,范例机关器的实行机会在语义上决意因而否显式的声了然静态机关函数,和存取静态成员的机会,这两个要素。
我们仍是从User类的完成提及,逐一过招剖析这两种体例的实行历程。
3.1precise体例
起首完成显式的静态机关函数计划,为:
  1. staticUser()7
复制代码
  1. //Author:Anytao,http://www.anytao.com
复制代码
  1. publicclassUser
复制代码
  1. {
复制代码
  1. {1
复制代码
  1. {2
复制代码
  1. //Author:Anytao,http://www.anytao.com0
复制代码
  1. {4
复制代码
  1. //Author:Anytao,http://www.anytao.com2
复制代码
  1. //Author:Anytao,http://www.anytao.com3
复制代码
  1. publicclassUser4
复制代码
  1. }
复制代码
对应的IL代码为:
  1. {9
复制代码
  1. message="Initializeinstaticconstructor.";0
复制代码
  1. publicclassUser7
复制代码
  1. message="Initializeinstaticconstructor.";2
复制代码
  1. //Author:Anytao,http://www.anytao.com0
复制代码
  1. message="Initializeinstaticconstructor.";4
复制代码
  1. message="Initializeinstaticconstructor.";5
复制代码
  1. message="Initializeinstaticconstructor.";6
复制代码
  1. message="Initializeinstaticconstructor.";7
复制代码
  1. message="Initializeinstaticconstructor.";8
复制代码
  1. message="Initializeinstaticconstructor.";9
复制代码
  1. }0
复制代码
  1. }1
复制代码
  1. }
复制代码
  1. [/code][code]}4
复制代码
  1. //Author:Anytao,http://www.anytao.com0
复制代码
  1. message="Initializeinstaticconstructor.";4
复制代码
  1. }7
复制代码
  1. }8
复制代码
  1. }9
复制代码
  1. }
复制代码
  1. [/code][code]2
复制代码
  1. 3
复制代码
为了举行对照剖析,我们必要起首剖析beforefieldinit体例的实行情形,以是接着持续。。。
3.2beforefieldinit体例
为User范例,不完成显式的静态机关函数计划,为:
  1. 4
复制代码
  1. //Author:Anytao,http://www.anytao.com
复制代码
  1. publicclassUser
复制代码
  1. {
复制代码
  1. 8
复制代码
  1. 9
复制代码
  1. //Author:Anytao,http://www.anytao.com2
复制代码
对应的IL代码为:
  1. publicUser()1
复制代码
  1. message="Initializeinstaticconstructor.";0
复制代码
  1. publicclassUser7
复制代码
  1. message="Initializeinstaticconstructor.";2
复制代码
  1. //Author:Anytao,http://www.anytao.com0
复制代码
  1. message="Initializeinstaticconstructor.";4
复制代码
  1. message="Initializeinstaticconstructor.";5
复制代码
  1. message="Initializeinstaticconstructor.";6
复制代码
  1. publicUser()9
复制代码
  1. }
复制代码
  1. [/code][code]}4
复制代码
  1. //Author:Anytao,http://www.anytao.com0
复制代码
  1. message="Initializeinstaticconstructor.";4
复制代码
  1. }7
复制代码
  1. }8
复制代码
  1. }9
复制代码
  1. }
复制代码
  1. [/code][code]2
复制代码
  1. 3
复制代码
3.3剖析不同
从IL代码的实行历程而言,我们起首能够懂得的是在显式和隐式完成范例机关函数的外部,除增加新的初始化操纵以外,两者的完成是基础不异的。以是要找出两种体例的不同,我们终极将着眼点锁定在两者元数据的声明上,隐式体例多了一个称为beforefieldinit标志的指令。
那末,beforefieldinit事实暗示甚么样的语义呢?ScottAllen对此举行了具体的注释:beforefieldinit为CLR供应了在任什么时候候实行.cctor的受权,只需该办法在第一次会见范例的静态字段之前实行便可。
以是,假如对precise体例和beforefieldinit体例举行对照时,两者的不同就在因而否在元数据声明时标志了beforefieldinit指令。precise体例下,CLR必需在第一次会见该范例的静态成员大概实例成员之前实行范例机关器,也就是说必需恰好在存取静态成员大概创立实例成员之前完成范例机关器的挪用;beforefieldinit体例下,CLR能够在任什么时候候实行范例机关器,必定水平上完成了对实行功能的优化,因而较precise体例加倍高效。
值得注重的是,当有多个beforefieldinit机关器存在时,CLR没法包管这多个机关器之间的实行按次,因而我们在实践的编码时应当只管制止这类情形的产生。
4回回成绩,需要的小结
本文源于Artech兄的一个成绩,但愿经由过程上文的剖析能够给出一点值得参考的背景。如今就关于TypeInitializer和BeforeFieldInit的成绩,看看人人可否给出准确的注释一文中的几个示例举行一些持续的剖析:

  1. //Author:Anytao,http://www.anytao.com12
复制代码
实行的了局不受影响。

  1. //Author:Anytao,http://www.anytao.com12
复制代码
的影响,完整切合beforefieldinit优化实行的语义界说。



5结论
除增补Artech老兄的成绩,本文算是持续了关于范例机关器在《你必需晓得的.NET》7.8节“动态之间:静态和非静态”中的切磋,以更周全的视角来进一步阐释这个成绩。在最初,关于beforefieldinit标志引发的范例机关器挪用优化的成绩,固然没有完整100%的懂得在Debug形式下的CLR挪用举动,可是深切细节我们能够掌控关于言语以内更多的了解,从这点而言,本文是个入手下手。
参考文献
《你必需晓得的.NET》7.8节“动态之间:静态和非静态”
Artech:关于TypeInitializer和BeforeFieldInit的成绩,看看人人可否给出准确的注释
经由过程七个关头编程技能得益于静态内容来自:http://www.ckuyun.com/anytao/archive/2008/11/02/must_net_23.html
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。
作者: 海妖    时间: 2015-1-20 23:26
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。
作者: 山那边是海    时间: 2015-1-30 07:30
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
作者: 活着的死人    时间: 2015-2-1 15:57
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
作者: 乐观    时间: 2015-2-3 17:46
主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。
作者: admin    时间: 2015-2-4 14:58
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
作者: 不帅    时间: 2015-2-10 02:06
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
作者: 再现理想    时间: 2015-2-18 14:52
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
作者: 飘灵儿    时间: 2015-3-1 15:30
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
作者: 简单生活    时间: 2015-3-7 16:41
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
作者: 愤怒的大鸟    时间: 2015-3-21 23:26
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2