String在C#中其實是不可變的,每次操作字元串變數增加或減少時,都會重新分配記憶體。試想一下,如果創建一個迴圈10000次的字元串加減操作,每次迴圈都將一個字元連接到字元串,這樣記憶體中就會有10000個字元串,每個字元串僅僅與前一個字元串相伴只是有一個字元不同,性能影響是很大的。這個時候我們可以使 ...
String在C#中其實是不可變的,每次操作字元串變數增加或減少時,都會重新分配記憶體。試想一下,如果創建一個迴圈10000次的字元串加減操作,每次迴圈都將一個字元連接到字元串,這樣記憶體中就會有10000個字元串,每個字元串僅僅與前一個字元串相伴只是有一個字元不同,性能影響是很大的。這個時候我們可以使用StringBuilder分配一個緩存,其實就是創建個工作區,然後在工作區中對字元串應用StringBuilder類的相關方法。例如Append,Remove,Insert,Replace等。執行完之後,調用ToString方法把工作區中的內容轉換為一個字元串,方便賦給一個字元串變數,相比之下在需要大量操作字元出變動時,應當使用StringBuilder提升程式性能。
String
- 它是引用類型,在堆上分配記憶體
- 每次增加&減少字元串時會產生一個新的實例
- String 對象一旦生成不可改變
- 定義相等運算符(== 和 !=)是為了比較 String 對象的值
在.NET中String是不可改變的引用類型對象,一旦創建了一個String對象並給它賦值,它就是不可再變的。這話聽起來似乎有些不可思議,大家也許馬上會想到字元串連接操作,我們不也可以改變字元串嗎?讓我們看下下麵的這段代碼
public static void Main(string[] args)
{
string str ="123";
Console.WriteLine(str); //輸出 123
str = str+"456";
Console.WriteLine(str); //輸出123456
Console.Read();
}
看起來似乎是把str的值從"123"改為了"123456",實際上並沒有改變。string str = "123";是創建了一個String對象它的值是"123",sstr指向了它在記憶體中的地址,s += "456";是創建了一個新的String對象它的值是"123456",str指向了新的記憶體地址。這時在堆中其實存在著兩個字元串對象,儘管我們只引用了他們中的一個,但字元串"123"仍然在記憶體中駐留。
StringBuilder
StringBuilder對象為動態字元串,可以對其設置好的字元數量進行擴展。另外,還可以設置一個最大長度,這個最大長度稱為該StringBuilder對象的容量,屬性名叫Capacity。
為StringBuilder設置容量的意義在於,當修改StringBuilder字元串時,當實際字元長度未達到其容量之前,StringBuilder不會重新分配空間,StringBuilder預設初始分配16個字元長度;手動設置容量的方式有兩種,代碼如下
//通過構造函數設置容量
StringBuilder sb1=new StringBuilder("cisharp.com",100);
//通過Capacity屬性設置容量
StringBuilder sb2=new StringBuilder("cisharp.com",100);
sb.Capacity=100;
StringBuilder常用方法
StringBuilder sb = new StringBuilder();
//追加字元串
sb.Append("111");
//追加一行
sb.AppendLine("111");
//插入字元串
sb.Insert(0, "22");
//移除字元串
sb.Remove(0, 2);
//替換字元串
sb.Replace("22", "33");
轉載自:C# String和StringBuilder的區別及性能詳解