1. 程式人生 > 其它 >C# StringBuilder和string

C# StringBuilder和string

StringBuilder和string

1.string是引用型別還是值型別

MSDN官方說string是引用型別;

引用型別:引用分配棧記憶體,引用型別本身的資料儲存在堆中;

值型別:在函式中建立,棧記憶體;類中成員變數堆型別;

從c底層記憶體分析,string本質是char*陣列;

char*不開堆,直接“ ”賦值儲存在常量記憶體區;

常量記憶體區在程式結束後由系統統一釋放;

string賦值和char*一樣,直接儲存在常量記憶體;

因此一個string重新賦值並不是修改引用指向,而是在常量記憶體去重新指向一個新的字串,這個操作相當於重新建立了例項,效能不好;

2.StringBuilder

StringBuilder相當於char* a = new char[lenth];

開了一塊堆記憶體專門儲存字串資料;

StringBuilder在建立物件時,可指定記憶體大小;

StringBuilder mStringBuilder = new StringBuilder("LittlePreilla",30);

當記憶體超出時,StringBuilder會自動將記憶體加倍;

mStringBuilder.Capacity = 10;		//設定記憶體
mStringBuilder.EnsureCapacity(10);	//檢查記憶體,大於10不變,小於10改為10

3.StringBuilder使用

1)拼接

mStringBuilder.Append("aaa");
mStringBuilder.AppendFormat("aaa{0:D}",1012);
字元 說明 示例 輸出
C 貨幣 string.Format("{0:C3}", 2) $2.000
D 十進位制 string.Format("{0:D3}", 2) 002
E 科學計數法 string.Format(“{0:e}”,1.2) 1.20E+001
G 常規 string.Format("{0:G}", 2) 2
N 用分號隔開的數字 string.Format("{0:N}", 250000) 250,000.00
X 十六進位制 string.Format("{0:X000}", 12) C
string.Format("{0:000.000}", 12.2) 012.200

2)插入

mStringBuilder.Insert(1,"ddd");		//index下表位置   

3)移除

mStringBuilder.Remove(1,2);		//index下表位置開始,移除幾位

4)替換

mStringBuilder.Replace("aaa","bbb");		

我個人格式化輸出更喜歡用正則表示式,也非常方便;

int a = 10;
string str = $"aaa{10}bbbb";
//結果為 aaa10bbbb