我們必須開門見山地說,在相同字串的許多操作上,使用 StringBuilder 類別會比使用一個 String 物件來得更有效率。
大家務必瞭解,System.String 資料型別(或是說 String 物件)代表的是一種不變的字串,也就是說,一旦您設定其值,您就不能更改它。如果您嚐試要插入、刪除或更改字串的任何部分,唯一的方式就是去建立一個新的字串。說得更專業點,每次字串資料變更時,記憶體中該字串原來的表示法就會被破壞掉,並建立內含新字串資料的新表示法,此舉會引發對記憶體的配置作業以及對記憶體的反配置作業。當然,這些作業都是在幕後完成的,因此真正的成本並不會立刻顯現。配置與反配置記憶體會加重 Common Language Runtime(CLR)裡記憶體管理和記憶體回收的相關工作,所以絕對是要付出代價的,直接的影響,就是增了處理時間。這種情況在迅速地接連配置和反配置佔有大塊記憶體的字串時尤其明顯,就像在大量字串串連時所發生的情況一樣。雖然這種情形在單一使用者環境裡不會帶來任何問題,但是在伺服器的環境裡使用時(比方說,在 Web 伺服器上執行的 ASP.NET® 應用程式中),卻可能在效能與延展性上造成極為嚴重的問題。
以下面這一段程式碼而言(請參閱 CH3_DemoForm017.vb 之「使用 String」按鈕的 Click 事件處理常式),您知道在每一次的迴圈中,會發生多少次的字串配置作業嗎?答案是 14。在此種寫法中,「&」(或「+」)運算子會使得變數 sXml 所指向的字串被破壞掉然後再重新建立。再次提醒您,字串配置是很花時間的,而且隨著字串的增長,情況會越來越嚴重。這正是 .NET Framework 為什麼要提供 StringBuilder 類別的
例子:
private string 取得字串(params string[] Params)
{
System.Text.StringBuilder sb = new StringBuilder();
string s = "";
for (int i = 0; i < Params.Length; i++)
{
sb.Append(Params[i]);
sb.Append('\t');
}
s = sb.ToString(0, sb.Length - 1);
sb = null;
string[] a=s.Split('\t');
return s;
}
留言列表