打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
性能: 字符串拼接

由于使用 System.String 类会在某些场合带来明显的性能损耗,所以微软另外提供了一个类型StringBuilder来弥补String的不足。

StringBuilder并不会重新创建一个string 对象,它的效率源于预先以非托管的方式分配内存。如果StringBuilder 没有先定义长度,则默认分配的长度为16。当 StringBuilder 字符长度小于等于 16时,StringBuilder 不会重新分配内存;当 StringBuilder 字符长度大于16 小于 32时,StringBuilder 又会重新分配内存,使之成为 16的倍数。在上面的代码中,如果预先判断字符串的长度将大于16,则可以为其设定一个更加合适的长度(如32)。StringBuilder重新分配内存时是按照上次的容量加倍进行分配的。当然,我们需要注意,StringBuilder指定的长度要合适,太小了,需要频繁分配内存;太大了,浪费空间。

曾经有人问我,下面的两种字符串拼接方式,哪种效率更高:

  1. 1.      private static void NewMethod8()  
  2.         {  
  3.             string a = "t";  
  4.             a += "e";  
  5.             a += "s";  
  6.             a += "t";  
  7.         }  
  8.  
  9. 2.      private static void NewMethod7()  
  10.         {  
  11.             string a = "t";  
  12.             string b = "e";  
  13.             string c = "s";  
  14.             string d = "t";  
  15.             string result = a + b + c + d;  
  16.         } 

答案是:两者效率都不高。不要以为前者比后者创建的字符串对象更少,事实上,两者创建的字符串对象相等,且前者进行了3次string.Contact方法调用,比后者还多了两次。

要完成这样的运行时字符串拼接(注意:是运行时),更佳的做法是使用StringBuilder类型,代码如下所示:

  1. private static void NewMethod10()  
  2. {  
  3.     //为了演示的需要,定义了4个变量  
  4.     string a = "t";  
  5.     string b = "e";  
  6.     string c = "s";  
  7.     string d = "t";  
  8.     StringBuilder sb = new StringBuilder(a);  
  9.     sb.Append(b);  
  10.     sb.Append(c);  
  11.     sb.Append(d);  
  12.     //再次提示,是运行时,所以没有使用下面的代码  
  13.     //StringBuilder sb = new StringBuilder("t");  
  14.     //sb.Append("e");  
  15.     //sb.Append("s");  
  16.     //sb.Append("t");  
  17.     string result = sb.ToString();  

微软还提供了另外一个方法来简化这种操作,即使用string.Format方法。string.Format方法在内部使用StringBuilder进行字符串的格式化,如下面的代码所示:

  1. private static void NewMethod11()  
  2. {  
  3.     //为了演示的需要,定义了4个变量  
  4.     string a = "t";  
  5.     string b = "e";  
  6.     string c = "s";  
  7.     string d = "t";  
  8.     string.Format("{0}{1}{2}{3}", a, b, c, d);  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#拼接string字符串
StringBuffer和StringBuilder的区别
C#中那些[举手之劳]的性能优化
常见的字符串处理功能扩展
第十五天 常用API-object&string&stringbuilder&stringbuffer【悟空教程】
昨天还在for循环里写加号拼接字符串的那个小姐姐,今天已经不在了
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服