1、分析string與stringbuilder的區別,我們先來看下面一段**
首先我們使用string進行字串的拼接
class program程式執行結果如下://結束計時
sw.stop();
console.writeline(str);
//輸出程式執行的時間
console.writeline(sw.elapsed);
console.readkey();}}
我們可以看到此時使用string程式的執行時間為0.125秒左右
下面我們再使用stringbulider
class program此時程式執行結果為//結束計時
sw.stop();
console.writeline(sb.tostring());
//輸出程式執行時間
console.writeline(sw.elapsed);
console.readkey();}}
我們可以看到使用stringbuilder程式執行時間只有0.0021秒左右,相比較與string程式執行速度快了許多倍
2、那麼為什麼stringbuilder的執行速度會比string快那麼多呢
首先,我們看string:
(1)、string字串,為引用型別,其具有不可變性。
我們一般認為的將記憶體分為五個區域。其中程式設計師常用的有三個,即棧、堆,靜態儲存區域。
其中值型別的值儲存在棧中,如int型別,而引用型別的值儲存在堆中
如下圖所示
而一旦我們將str的值改變 str=「李四」 看似我們改變的str的值,實際上
當str=「李四」時,我們在堆中新建立了乙個物件「李四」其位址自然發生改變0x001001被乾掉,換成了李四在堆中的位址0x002003
即看似我們改變了str的值,實際上卻建立了乙個新的物件。
我們可以用乙個簡單的**看一下其實際的運**況:
我們使用監視器跟蹤str其中 *str跟蹤其位址,可以看到此時str的位址為0x00000000
使用逐語句進行除錯
當str的值為「張三」後其位址發生了改變
而當str=「李四」後其位址又發生了改變
因此string型別具有不可變性,一旦其值發生了改變,就是乙個新的物件。即每次對字串進行操作時就會產生乙個新的物件。
(2)、而stringbuilder類解決了在對字串進行重複修改的過程中建立大量物件的問題。stringbuilder類以char為單位向字串分配空間,所以操作中不需要進行額外的記憶體分配。
對stringbuilder我們也可以使用上述**來說明。
我們可以看到整個過程並不會發生位址的改變。
綜上,如果操作少量的資料,我們可以使用string
如果有大量的字元拼接等操作,我們應使用stringbuilder。
萬丈高樓平地而起,基礎最重要!
關於string 與stringbuilder的一些常用方法會在下篇部落格簡單總結。
String與string的區別
1 string是乙個類,string是一種資料型別.2 string是c 中的類,string是.net framework的類 在c ide中不會顯示藍色 3 c string對映為.net framework的string 4 如果用string,編譯器會把它編譯成string,所以如果直接用...
string與string標頭檔案
先來段 我是在vs2012上實驗的 include stdafx.h include include include using namespace std int tmain int argc,tchar argv cout endl for rit mapstudent.rbegin rit m...
String與string的區別
c 是區分大小寫的,但是我卻發現c 中同時存在string與string,於是我很困惑,於是我上網搜尋了一下,於是我了解了一些小知識。msdn中對string的說明 stringis analiasforstringin the net framework。string是string的別名而已,st...