为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

使用stringbuilder做字符串连接

2017-12-07 4页 doc 15KB 12阅读

用户头像

is_482581

暂无简介

举报
使用stringbuilder做字符串连接使用stringbuilder做字符串连接 1、使用StringBuilder做字符串连接 string是不变类,使用+操作连接字符串会导致创建一个新的字符串。如果字符串连接次数不是固定的,例如在一个循环操作中,则应该使用StringBuilder类来做字符串连接工作。因为StringBuilder内部有一个StringBuffer,连接字符操作不会每次分配新的字符串空间。只有当连接后的字符串超出Buffer大小是,才会申请信的Buffer空间。典型代码如下: StringBuiler sb = new StringBu...
使用stringbuilder做字符串连接
使用stringbuilder做字符串连接 1、使用StringBuilder做字符串连接 string是不变类,使用+操作连接字符串会导致创建一个新的字符串。如果字符串连接次数不是固定的,例如在一个循环操作中,则应该使用StringBuilder类来做字符串连接工作。因为StringBuilder内部有一个StringBuffer,连接字符操作不会每次分配新的字符串空间。只有当连接后的字符串超出Buffer大小是,才会申请信的Buffer空间。典型代码如下: StringBuiler sb = new StringBuilder(256); for(int i = 0; i < str.Count; i++) { sb.Append(str[i]); } 而如果连接字符数十固定的并且只有几次,此时应该直接用+号连接,保持程序简洁易读。实际上,编译器已经做了优化,会依据加号次数调用不同参数个数的String.Concat方法。例如: String str = str1 + str2 + str3 + str4; 会被编译成:Sting.Concat(str1,str2,str3,str4).该方法内部会计算总的String长度,仅分配一次,并不会如通常想象的那样分配三次。作为一个值,当字符串连接操作达到10此以上时,则应该使用StringBuilder. 这里有个细节要注意:StringBuilder内部Buffer的缺省值为16,这个实在太小。按照StingBuilder的使用场景,Buffer肯定得重新分配。我建议使用256作为Buffer的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这个值来设定Buffer的初值。我曾经开发过一个44位的UUID生成方法,仅仅把new StringBuilder()改为StringBuilder(44)前后就有3倍的效率差异。 2、避免不必要的调用ToUpper或ToLower方法 String是不变类,调用ToUpper或ToLower方法都会导致创建一个新字符串。如果被频繁调用,将导致频繁创建字符串对象。这违背了前面讲到的“避免频繁创建对象”这一基本原则。 例如,bool.Parse方法本身已经是忽略大小写的,但下面的代码每次访问IsNullable属性时,都要不必要的调用ToLower方法: public virtual bool IsNullable { get { if(isSyncDictionary && this.DictionaryItem ! = null) { if(this.dictionaryItem.IsNullableValid) { return bool.Parse(dictionaryItem.IsNullable.ToString().ToLower()); } } } } 另外一个非常铺平的场景是字符串比较,例如: foreach (XmlNode node in DocumentElement.ChildNodes) { if (node is XmlElement) { if (node.Name.ToLower() == "appender") { Respoitory.AppenderLoader.Load(node); } else if (node.Name.ToLower() == "Render") { Respoitory.AppenderLoader.Load(node); } else if (node.Name.ToLower() == "Render") { Respoitory.RegisterUtilRunner.RunningRegisterUtil(node); } } } 高效的做法是使用Compare方法,这个方法可以做大小写忽略的比较,并且不会创建 新字符串: if (String.Compare(node.Name,"appender",StringComparison.OrdinalIgnoreCase)==0) 最后列举的一个示例是使用HashTable的时候,有时候无法保证传递key的大小写是 否符合预期,往往会把key强制转换到大小写方式,例如: myTalbe.Add(myKey.ToLower(),myObject).实际上HashTable有不同的构造方式,完全支持 采用忽略大小写的Key:new HashTable(StringComparer.OrdinalIgnoreCase). 3、最快的空串比较方法 将String对象的Length属性与0比较式最快的方法:if(str.Length == 0) 其次是与sting.Empty常量或空串比较;if(str == String.Empty)或if(str == "") 注:C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool), 相同常量不会重复分配。
/
本文档为【使用stringbuilder做字符串连接】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索