ASP.NET教程之你必需晓得的.NET]第二十二回:字符串驻留(上)――带着成绩思索仓酷云 ...
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……系列文章目次索引:《你必需晓得的.NET》<br>说在,开篇之前走钢丝的人,在安慰中体验快感。带着成绩思索,在成绩上迸生机花。
大概给成绩以谜底,大概给谜底以成绩,你大概永久没法看清全体,可是总能从一点冲破良多。现实的关头就在于面临成绩,我该怎样思索?
StringInterning(字符串驻留)就是如许一个值得思索的话题,带着成绩思索,我们最少要理清以下几个成绩:
[*]甚么是string?
[*]甚么是字符串驻留?
[*]字符串驻留的运转机制及实行历程?
[*]字符串驻留的其他成绩?
带着几个问号,你必需晓得的.NET,持续更多体验。
1带着成绩?
带着成绩思索,是手艺探究的最好理论,每当我收到良多伴侣来函切磋手艺的成绩,总能给我良多的手艺思考和欣喜,明天我们的话题就是由一个伴侣的来函入手下手的,你能够经由过程链接翻开KiMoGiGi在To王涛的成绩一文中出色尽伦的思索和切磋,带着他的发问,引着我的思索,完本钱文对string的一点点切磋。
<br>快速参考
[*]KiMoGiGi:《To王涛的成绩》
起首,本文也无一破例的从8个测试入手下手,也但愿读者能沿着这几个复杂的示例来思索谜底。假如对此包括热忱,无妨能够尝尝,你入手下手了吗?
//Release:code01,2008/08/20//Author:Anytao,http://www.anytao.comstaticvoidMain(){strings1="abc";Console.WriteLine(string.IsInterned(s1)??"null");}这是个复杂的例题,能够很快给出谜底。
//Release:code02,2008/08/20//Author:Anytao,http://www.anytao.comstaticvoidMain(){//Author:Anytao,http://www.anytao.com1//Author:Anytao,http://www.anytao.com2//Author:Anytao,http://www.anytao.com3//Author:Anytao,http://www.anytao.com4略加修正,这回的谜底又该怎样剖析,我们持续。
//Author:Anytao,http://www.anytao.com5//Author:Anytao,http://www.anytao.comstaticvoidMain(){strings1="abc";staticvoidMain()0staticvoidMain()1staticvoidMain()2staticvoidMain()3staticvoidMain()4//Author:Anytao,http://www.anytao.com3staticvoidMain()6staticvoidMain()7staticvoidMain()8}假如上述实行历程,你能很快给出谜底,那末祝贺了,第一关看来不是那末费力,我们接着思索,持续第二关:
{0//Author:Anytao,http://www.anytao.comstaticvoidMain(){strings1="abc";staticvoidMain()0{6staticvoidMain()4{8//Author:Anytao,http://www.anytao.com4另有一个,我们持续
strings1="abc";0//Author:Anytao,http://www.anytao.comstaticvoidMain(){strings1="abc";4strings1="abc";5strings1="abc";6staticvoidMain()6strings1="abc";6strings1="abc";9}你的谜底怎样是?我们仍是接着欢迎应战:
Console.WriteLine(string.IsInterned(s1)??"null");1//Author:Anytao,http://www.anytao.comstaticvoidMain(){strings1="abc";4strings1="abc";5strings1="abc";6staticvoidMain()6strings1="abc";6}0}1staticvoidMain()4}3{}5//Author:Anytao,http://www.anytao.com4这是第二关了,你的思索一定还在持续,我们第三关也呼之欲出:
}7//Author:Anytao,http://www.anytao.com}9staticvoidMain()4staticvoidMain(){strings1="abc";4strings1="abc";5strings1="abc";6staticvoidMain()6}最初一个,冲出藩篱:
//Release:code02,2008/08/208//Author:Anytao,http://www.anytao.com//Author:Anytao,http://www.anytao.com0staticvoidMain()4staticvoidMain(){strings1="abc";4strings1="abc";5strings1="abc";6staticvoidMain()6}过关斩将,三轮PK,是好汉比高。不论如何,你的谜底和思索,一定会让人人对string另眼相看,是不是和你一向以来的熟悉一致呢?有了成绩,我们更必要的是思索、切磋和深思。
2欲求思索
欲求思索,则从基础入手下手,关于了解全部stringintern机制是年夜有裨益的,因而深切的第一步就从基础观点入手下手。跟着我们剖析的层层深切,就会发明看似崎岖的了局,本来不外云云罢了,这恰是手艺寻找的最好体例。
甚么是string
甚么是string呢,提起这个成绩,我想上面的图例能够给出一点启发:
<br>
string在实质上就是连续串的有按次的字符汇合。
复杂的说,string就是char[],而在.NET中string头一回具有了类的观点,暗合了.NET统统皆为对象的年夜一统格式。回回实质,我们从头审阅云云另类而多彩的string,你会不由分明,string实质上就是一个16位Unicode字符数组。翻开string的Disassemble代码,我们可直击其实质:
//Author:Anytao,http://www.anytao.com9staticvoidMain()0staticvoidMain()1//Author:Anytao,http://www.anytao.com4分离string的界说,我们能够看出其基础的特征次要包含:
[*]援用范例,string实质上是援用范例,相干内容参考《你必需晓得的.NET》对值范例和援用范例的会商。
[*]字符串恒等性。
[*]字符串驻留性,本文的研讨重点。
[*]密封性,由sealed关头字可见,sealed特征为完成字符串恒等性和字符串驻留机制,供应了基本包管,详细的缘故原由拜见《你必需晓得的.NET》关于string的相干叙述。
关于这些特征并不是本文存眷的热门,另有大批的命题值得我们存眷,总结起来还可包含:
[*]字符串对照:以等价划定规矩而非恒等划定规矩举行对照。
[*]经常使用办法:Trim()、ToLow()、Replace()、Split()、PadRight()、SubString()和Join()
[*]格局化。
[*]转移字符。
[*]StringBuilder,另外一个主要的话题。
[*]Encoding,编码。
[*]Culture&Internationalization,言语文明。
[*]overloads==,==重载。
由此可知,string真是一个丰厚而多彩的手艺堆栈,饱含了.NET手艺中良多精华与技能,我们不成能在本文中尽述其然,更多的叙述和剖析能够参考以下信息:
<br>快速参考关,你能够参考:
[*]string的更多手艺与划定规矩,能够参考《你必需晓得的.NET》8.3节“云云特别:诳言String”
[*]等价划定规矩和恒等划定规矩,能够参考《你必需晓得的.NET》8.2节“划定规矩而定:对象判等”
接上去,本文的主题闪亮退场。
甚么是字符串驻留(StringInterning)
回回典范,我们起首给出MSDN关于字符串驻留的一点会商:
大众言语运转库经由过程保护一个表来寄存字符串,该表称为拘留池,它包括程序中以编程体例声明或创立的每一个独一的字符串的一个援用。因而,具有特定值的字符串的实例在体系中只要一个。
比方,假如将统一字符串分派给几个变量,运转库就会从拘留池中检索对该字符串的不异援用,并将它分派给各个变量。
之以是,将string这个熟习的命题拿出来造轮子,并非再造个轮子本人沉醉。关于string的轮子,其实太多了,并且个个不扎眼,它就像编程的精灵,到处可见到处都有。string是云云的主要,以致于CLR必需以特别的体例来完成对string范例的办理、存取和结构,在这些庞大的特别表象中,字符串驻留机制是string特别性的会合表现,它的基础道理能够归纳综合为:
[*]CLR保护一个相似于哈希表的外部布局,用于保护关于字符串的一致办理。
[*]但JIT编译时,CLR起首查找哈希表,假如没有找到婚配的字符串纪录,则在托管堆中创立新的string实例,并为哈希表增加一个键值对纪录;下一次查找不异string时,则只前往该纪录的值给第二次创立的string对象。
[*]经由过程这类体例,字符串驻留机制无效完成了对string的池办理,节俭了大批的内存空间。
具体的字符串驻留机制,敬请参考:
<br>快速参考关于字符串驻留机制的具体历程,不是本文所要办理的次要成绩,你能够参考:
[*]《你必需晓得的.NET》8.3节“云云特别:诳言String”中的具体剖析
[*]Artech,[原创]再说String
我们能够从code01恣意明白字符串驻留机制的基础道理,但是关于字符串驻留,并非几句复杂道理就可以周全归纳综合的成绩。
注重:静态创立的字符串是不实行字符串驻留机制的,比方经由过程:
staticvoidMain()3//Author:Anytao,http://www.anytao.comstaticvoidMain()5staticvoidMain()6staticvoidMain()7staticvoidMain()8staticvoidMain()9staticvoidMain()2//Author:Anytao,http://www.anytao.com01//Author:Anytao,http://www.anytao.com4可是关于“静态”二字的掌控并不是一件复杂的事变,甚么情形下实行字符串驻留,而甚么时分不会实行字符串驻留,在.NETspec中我并没有找出充足准确的正解来阐释这个成绩,比方code06示例中,strings1=GetStr();的地位很年夜水平上决意了是不是实行字符串驻留前提,从code06示例的了局可见,string.IsInterned(s2)并未劳绩前往“abc”的预期了局,而上面的示例则又给出意想不到的谜底:
//Author:Anytao,http://www.anytao.com03//Author:Anytao,http://www.anytao.comstaticvoidMain()5staticvoidMain()6//Author:Anytao,http://www.anytao.com07//Author:Anytao,http://www.anytao.com08staticvoidMain()7staticvoidMain()8//Author:Anytao,http://www.anytao.com11//Author:Anytao,http://www.anytao.com12}staticvoidMain()2//Author:Anytao,http://www.anytao.com15staticvoidMain()6//Author:Anytao,http://www.anytao.com17//Author:Anytao,http://www.anytao.com4对照code06和code10,我们发明分歧的只是strings1=GetStr();的地位,而了局却天差地别。
为何?
地位的分歧而招致触发字符串驻留机制是不是实行的前提分歧,这恰是我们经由过程实例反向考证的最好表现。那末,你的思索呢?
这些看似熟习的成绩,实在都值得斟酌,本文没有太多的精神分身一切,只能在边沿之余切磋一下遗留在字符串驻留机制中一些并非很分明的成绩,算是对字符串驻留机制的进一步切磋,次要包含:
[*]CLR的加载历程。
[*]internpool在甚么时分创立,怎样创立?
[*]驻留机制的简述。
[*]办法的挪用历程。
[*]先容IsInterned和Intern办法。
[*]stringintern的生效和坏处。
以办理本文开题的几个典范的成绩,同时特地解答KiMoGiGi在To王涛的成绩中提出的成绩。上面我们逐一揭开这些成绩的奥秘面纱。
作为字符串驻留机制切磋的第一篇,我们从成绩动身引出关于字符串驻留的界说和观点,在将来的篇章中除申明上述成绩以外,我们还将力争注释开篇8个示例的其中了局,并对大概的情形和成绩举行一些对照性的斟酌。
现实上,由stringintern而激发的手艺论题,另有良多值得我们咀嚼和玩味,这也恰是这个本文及厥后续篇章力争做出的勉力。
参考文献
(Book)MartinFowler,Refactoring:ImprovingtheDesignofExistingCode
(cnblog)http://www.ckuyun.com/flier/archive/2004/07/08/22307.html
(cnblog)http://www.ckuyun.com/artech/archive/2007/05/31/765773.html
来自:http://www.ckuyun.com/anytao/archive/2008/08/27/must_net_22.html
net网页编程的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。 主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。 众所周知,Windows以易用而出名,也因此占据不少的服务器市场。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。 市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。 逐步缩小出错代码段的范围,最终确定错误代码的位置。 由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
页:
[1]