由于使用 System.String 類會在某些場合帶來明顯的性能損耗,所以微軟另外提供了一個類型StringBuilder來彌補String的不足。
StringBuilder并不會重新創(chuàng)建一個string 對象,它的效率源于預先以非托管的方式分配內(nèi)存。如果StringBuilder 沒有先定義長度,則默認分配的長度為16。當 StringBuilder 字符長度小于等于 16時,StringBuilder 不會重新分配內(nèi)存;當 StringBuilder 字符長度大于16 小于 32時,StringBuilder 又會重新分配內(nèi)存,使之成為 16的倍數(shù)。在上面的代碼中,如果預先判斷字符串的長度將大于16,則可以為其設定一個更加合適的長度(如32)。StringBuilder重新分配內(nèi)存時是按照上次的容量加倍進行分配的。當然,我們需要注意,StringBuilder指定的長度要合適,太小了,需要頻繁分配內(nèi)存;太大了,浪費空間。
曾經(jīng)有人問我,下面的兩種字符串拼接方式,哪種效率更高:
- 1. private static void NewMethod8()
- {
- string a = "t";
- a += "e";
- a += "s";
- a += "t";
- }
- 2. private static void NewMethod7()
- {
- string a = "t";
- string b = "e";
- string c = "s";
- string d = "t";
- string result = a + b + c + d;
- }
答案是:兩者效率都不高。不要以為前者比后者創(chuàng)建的字符串對象更少,事實上,兩者創(chuàng)建的字符串對象相等,且前者進行了3次string.Contact方法調(diào)用,比后者還多了兩次。
要完成這樣的運行時字符串拼接(注意:是運行時),更佳的做法是使用StringBuilder類型,代碼如下所示:
- private static void NewMethod10()
- {
- //為了演示的需要,定義了4個變量
- string a = "t";
- string b = "e";
- string c = "s";
- string d = "t";
- StringBuilder sb = new StringBuilder(a);
- sb.Append(b);
- sb.Append(c);
- sb.Append(d);
- //再次提示,是運行時,所以沒有使用下面的代碼
- //StringBuilder sb = new StringBuilder("t");
- //sb.Append("e");
- //sb.Append("s");
- //sb.Append("t");
- string result = sb.ToString();
- }
微軟還提供了另外一個方法來簡化這種操作,即使用string.Format方法。string.Format方法在內(nèi)部使用StringBuilder進行字符串的格式化,如下面的代碼所示:
- private static void NewMethod11()
- {
- //為了演示的需要,定義了4個變量
- string a = "t";
- string b = "e";
- string c = "s";
- string d = "t";
- string.Format("{0}{1}{2}{3}", a, b, c, d);
- }