|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。明天,我在写C#代码时,俄然发明一个最熟习的生疏人——string.Format。在写C#代码的日子里,与它旦夕相伴,却没有真正往懂得它。只晓得在字符串对照多时,用它比用加号举行字符串联接效力更高(固然也更便利)。但是却历来没有问过为何?
在生存中也有相似的征象,与你旦夕相处、你最熟习的人,你常常不会进一步往懂得她(他),你已习气了她(他),你以为你已太懂得她(他)了。。。真的是如许吗?这值得往思索。。。
博问中的一个成绩——StringBuilder,String.concat(),String+String哪个效力高?引发了我的猎奇心,想一探string.Format的事实,并且在开辟中也恰好碰到一个字符串联接的成绩。
懂得.NET天下中的工具实在很复杂,只需经由过程工具反编译出响应的.NET类库代码,我们来看看string.Fomat的代码:
- publicstaticstringFormat(stringformat,objectarg0,objectarg1,objectarg2){if(format==null)thrownewArgumentNullException("format");returnstring.Format((IFormatProvider)null,format,arg0,arg1,arg2);}
复制代码
实践挪用的是别的一个署名的string.Format:
- publicstaticstringFormat(IFormatProviderprovider,stringformat,paramsobject[]args){if(format==null||args==null)thrownewArgumentNullException(format==null?"format":"args");StringBuilderstringBuilder=newStringBuilder(format.Length+args.Length*8);stringBuilder.AppendFormat(provider,format,args);return((object)stringBuilder).ToString();}
复制代码
哦,本来用的就是StringBuilder(大概你早就晓得了),string.Format只是StringBuilder的改装精简版。
既然是StringBuilder,它一定没法制止一个影响StringBuilder功能的成绩——初始化容量(capacity)的成绩,string.Format是怎样办理的呢?从下面的代码一眼就能够看出,初始化容量是这么盘算出来的:
- format.Length+args.Length*8
复制代码 从这个盘算公式能够看出,假定必要format的字符串是10个,假如这10字符串累加起来的字符数不凌驾80,就可以发扬StringBuilder的最好功能;不然,StringBuider必要扩容,从而带来功能丧失。
以是,关于年夜字符串,string.Format不是最好选择。
那最好选择是甚么?仍是StringBuilder,只不外要本人写代码盘算初始化容量。分享一下明天我们在实践开辟中利用的代码:
- varbodyFormat="<spanid="comment_body_{0}">{1}</span><br/>";vardiggFormat="<ahref="javascript:void(0);"onclick="voteComment({0},Digg)">撑持({2})</a>";varburyFormat="<ahref="javascript:void(0);"onclick="voteComment({0},Bury)">否决({3})</a>";varargs=newstring[]{comment.ID.ToString(),comment.Body,comment.DiggCount.ToString(),comment.BuryCount.ToString()};//盘算初始化容量intcapacity=bodyFormat.Length+diggFormat.Length+buryFormat.Length;for(inti=0;i<args.Length;i++){capacity+=args[i].Length;}varsb=newStringBuilder(capacity);sb.AppendFormat(bodyFormat,args);sb.AppendFormat(diggFormat,args);sb.AppendFormat(buryFormat,args);Post.Text=sb.ToString();
复制代码
这里没有利用string.Format,一是由于comment.Body的字符数会良多,string.Format分派的初始化容量不敷。二是由于string.Format不克不及分批Fomat,格局字符串只能写在一同,形成格局字符串很长,也就是bodyFormat,diggFormat,buryFormat要拼成一个字符串。
一个很大的类库。应用程序之所以难以跨平台,在于直接调用了特定平台的接口,而一个巨大的类库,就能极大地减少应用程序对平台的依赖。 |
|