來源:http://www.witshare.org/bbs/blogs/leoking/archive/2009/07/30/stringbuilder.aspx
String 對象是不可改變的。每次使用 System.String 類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要爲該新對象分配新的空間。在需要對字符串執行重複修改的情況下,與創建新的 String 對象相關的系統開銷可能會非常昂貴。如果要修改字符串而不創建新的對象,則可以使用 System.Text.StringBuilder 類。
StringBuilder可以在實例化的時候承載一個字符串,然後在後期動態的改變字符串中的值,而不會重新創建和銷燬對象。
System.Text.StringBuilder sb = new StringBuilder("Hello");
sb.Append(" C#");
sb.AppendLine("www.witshare.org");
sb.Append(DateTime.Now);
System.Console.WriteLine(sb.ToString());
運行的結果如圖3.1.31:
圖3.1.31
對於運行的結果,我們可以瞭解到StringBuilder可以動態的爲字符串追加信息,甚至是一行帶回車信息的字符串。
StringBuilder不但可以追加,也可以對字符串做出其他不同的處理。
System.Text.StringBuilder sb = new StringBuilder("Hello");
sb.Append(" C#");
sb.Insert(0,"www.witshare.org");
sb.Insert(sb.Length - 1, ".", 12);
sb.Append(DateTime.Now);
sb.Remove(0, 4);
System.Console.WriteLine(sb.ToString());
運行的結果如圖3.1.32:
圖3.1.32
雖然 StringBuilder 的對象是動態對象,允許擴充它所封裝的字符串中字符的數量,但是您可以爲它可容納的最大字符數指定一個值。此值稱爲該對象的容量,不應將它與當前 StringBuilder 對象容納的字符串長度混淆在一起。
以下代碼描述了這個過程:
System.Text.StringBuilder sb = new StringBuilder("Hello", 10);
System.Console.WriteLine("StringBuilder最大長度{0}", sb.Capacity);
sb.Append("C#");
sb.Insert(0, "www.witshare.org");
sb.Insert(sb.Length - 1, ".", 12);
sb.Append(DateTime.Now);
sb.Remove(0, 4);
System.Console.WriteLine("StringBuilder產生的字符串的實際長度{0}", sb.ToString().Trim().Length);
System.Console.WriteLine("StringBuilder最大長度{0}", sb.Capacity);
運行的結果如圖3.1.33:
圖3.1.33
StringBuilder各種方法中最強大的是AppendFormat方法,該方法運行以格式化的能力插入字符串,以下代碼描述瞭如何使用這個方法:
System.Text.StringBuilder sb = new StringBuilder("Hello", 10);
sb.AppendFormat("{0}\n{1}\t{2}", 1 + 1, DateTime.Now, new int[] { 4, 5, 6, 7 });
System.Console.WriteLine(sb.ToString());
運行結果如圖3.1.34:
圖3.1.34
除非你需要大量的對字符串進行插入、追加和移除,那麼你確實的需要使用StringBuilder類,而StringBuilder類最強大的AppendFormat卻不一定需要StringBuilder進行實現。String類的Format方法本質上和StringBuilder的AppendFormat相同,筆者更建議你使用String類的Format。
System.Console.WriteLine(string.Format("你好,現在是{0}{1}點", DateTime.Now.Hour < 12 ? "上午" : "下午", DateTime.Now.ToShortTimeString()));
運行的結果如圖3.1.35: