摘要:首先對.Net Frameword中字符串內存的存放方式進行了分析,然后針對說明StringBuilder類的工作方式及性能對比,最后給出StringBuilder類常用的方法。
關鍵詞:StringBuilder .Net Frameword 字符串 軟件開發
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)33-9353-02
1 .Net Framework字符串存儲方式及StringBuilder類突破點分析
StringBuilder是.NET Framework一個功能強大的新類,功能是對字符串進行拼接、插入、刪除、替換等操作,從功能而言,并沒有太大的突破,所有的平臺語言對字符串操作都有相對應的功能,StringBuilder的價值在于能高效地實現這些功能,而不是簡單的進行重復。
在解析StringBuilder的高效前,必須首先了解.Net Framework對字符串進行存儲的一個重要特性:所有字符串對應的內存都是不可改變的,也就是說,字符串的內存存儲單元是不可以更改的。在.Net Framework中不可以真正直接改變一個字符串變量的內容,如果更改了一個字符串的取值,那么該字符串原來對應的內存將被作廢,而內存中一個新的地址將被重新創建并分配給字符串去存儲新的取值。例如,下面的代碼對字符串S的取值作出修改:
string S;
S = ¨AAA¨;
S = ¨BBB¨;
由于在.Net Framework中,內存中的字符串的存儲內容不可以更改,每當你改變S的取值,.Net Framework都會在內存的一個新位置重新創建一個新的字符串,所有上面的程序會導致這樣的一個結果:內存在某個位置(假定內存地址為3000)存放S,但位置3000什么都沒有(只有S的初始值);然后在新的位置(3010)存儲了字符串“AAA”,最后在第三個位置(3030)存儲了字符串“BBB”。.Net Framework不斷地創建新的字符串,同時不斷改變S的索引,指向新的內存地址。可見,這種方式非常笨拙,雖然有效但效率不可能高。
StringBuilder類則以完全不同的方式工作,當你創建了StringBuilder類的實例后,你就定義了一個字符串的內存塊,這個內存塊的內容是可以被改變的,通過StringBuilder,我們可以直接改變字符串內存的內容。例如,運用StringBuilder實現上一個例子的功能:
System.Text.StringBuilderSB = new System.Text.StringBuilder();
SB.Append(¨AAA¨);
SB.Replace(¨AAA¨, ¨BBB¨);
.Net Framework首先在內存創建一個新的內存塊(假定內存位置也是3000),開始內容為空,然后變成“AAA”,隨后變成“BBB”。可見從功能的實現上,StringBuilder對比傳統的方式有重大的突破,這是StringBuilder高效性的基礎。
2 StringBuilder性能對比
這種直接修改內存的能力使StringBuilder具備明顯的速度優勢。我們可以通過兩個簡單的功能一樣的循環程序進行驗證。
首先我們不使用StringBuilder,使用傳統方法,直接對string進行操作,對一個字符串進行10000次的拼接:
stringst = ¨¨;
for (int i=0;1<10000;i++){
st += i.ToString();
st +=¨,¨;}
然后我們使用StringBuilder類來實現同樣的功能:
System.Text.StringBuilderSB = new System.Text.StringBuilder();
for (int i=0;1<10000;i++){
SB.Append (i);
SB.Append (,);}
在我的電腦,同樣的硬件配置及系統環境中,使用傳統方法程序運行5秒完成,使用StringBuilder的程序在1秒內完成!可見從效率上兩者之間的差異是很大的。
3 StringBuilder各種功能的實現
3.1 拼接功能
在StringBuilder類中,Append和AppendFormat是最常用的兩個方法,它們實現StringBuilder的拼接功能。Append方法可以直接把一個新值加入到字符串空間,而且新值的數據類型不需要進行轉換。可以使用Append簡單地把每一個變量的內容加入字符串,不用管這個變量的類型是什么,例如把一個bool類型的變量實例直接加入StringBuilder的實例中。
使用AppendFormat可以將各種類型的數據加入字符串空間,并且進行格式化。如下面的例子中,把double類型的變量dou直接加入StringBuilder 的實例SB,并進行格式化,程序運行后將會顯示 $888.88:
double dou=888.88;
System.Text.StringBuilderSB = new System.Text.StringBuilder();
SB.AppendFormat (¨{0:c}¨,dou );
Reponse.Write(SB.ToString());
3.2 插入和刪除功能
在StringBuilder類中,Inert實現插入功能。Insert方法中需給出起始位置和具體字符串值。如你想在字符串“AAA CCC”中插入“BBB”,成為“AAA BBB CCC”可以執行以下代碼:
SB.Append(¨AAA CCC¨);
SB.Insert(4, ¨BBB ¨);
在StringBuilder類中,Remove實現刪除功能。Remove方法中需給出起始位置和刪除字符串的長度,如想把剛才執行完Insert的字符串去掉剛插入的“BBB”可以執行以下代碼:
SB.Remove(4,4);
3.3 替代功能
在StringBuilder類中,Replace實現替代功能。Replace方法需要給需要替換的字符串和替代用的字符串,還可以指定范圍。如你想把“ABCD ABCD”中的“AB”都換成“EF”,字符串變為“EFCD,EFCD”,可以執行以下代碼:
SB.Append(¨ABCD ABCD¨);
SB.Replace(¨AB¨,¨EF¨);
如果只想把“ABCD ABCD”中第一個“AB”都換成“EF”,字符串變為“EFCD,ABCD”,可以指定替代范圍,執行以下代碼:
SB.Append(¨ABCD ABCD¨);
SB.Replace(¨AB¨,¨EF¨,0,4);
3.4 容量監控功能
在StringBuilder類中,通過Capacity屬性設置StringBuilder實例的容量,你可以在實例化StringBuilder時設置初始的容量值,也可以通過類方法EnsureCapacity來自動分配字符串空間,以便隨時容納新數據,如果擔心容量設置錯誤而造成程序報錯,可以使用一個try…catch塊進行恢復。
4 結論
.Net Framework中的字符串存儲不可改變,使用StringBuilder類操作字符串比使用傳統方法高效得多,值得在.Net Framework的開發中使用。
參考文獻:
[1] 朱仲杰.Java2全方位學習[M].北京:機械工業出版社,2006.
[2] 趙克立.C#.NET 編程培訓教程[M].北京:清華大學出版社,2003.