您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關String與StringBuilder在C#中有什么區別,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
簡介區別
String的缺點是每次字符串變量的內容發生了改變時,都必須重新分配內存。你想想,如果創建一個迭代100000次的循環,每次迭代都將一個字符連接到字符串,這樣內存中就會有100000個字符串,每個字符串僅僅與前一個字符串相伴只是有一個字符不同,性能影響是很大的。
StringBuilder通過分配一個緩存,就是一個工作區來解決這些問題,在工作區中隊字符串應用StringBuilder類的相關方法。包括添加,刪除,移除,插入和替換字符等等。執行完之后,將調用ToString方法把工作區中的內容轉換為一個字符串,方便賦給一個字符串變量。這樣StringBuilder會提升一些性能。
String類型對象的特點:
1.它是引用類型,在堆上分配內存
2.運算時會產生一個新的實例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運算符(== 和 !=)是為了比較 String 對象的值(而不是引用)
在.NET中String是不可改變對象,一旦創建了一個String對象并給它賦值,它就不可能再改變,也就是你不可能改變一個字符串的值。這句活初聽起來似乎有些不可思議,大家也許馬上會想到字符串連接操作,我們不也可以改變字符串嗎?看下面的這段代碼:
public static void Main(string[] args) { string s ="abc"; Console.WriteLine(s); //輸出 abc s = s +"def"; Console.WriteLine(s); //def Console.Read(); }
看起來我們似乎已經把s的值從"abc"改為了"abcdef",實際上并沒有改變。string s = "abc";是創建了一個String對象它的值是"abc",s指向了它在內存中的地址,s += "def";是創建了一個新的String對象它的值是"abcdef",s指向了新的內存地址。這時在堆中其實存在著兩個字符串對象,盡管我們只引用了他們中的一個,但字符串"abc"仍然在內存中駐留。
前面說過String是引用類型,如果我們創建很多個相同值的字符串對象,它在內存中的指向地址應該是一樣的。也就是說,當我們創建了字符串對象s,它的值是"abc",當我們再創建一個值為"abc"的字符串對象str時它不會再去分配一塊內存空間,而是直接指向了s在內存中的地址。這樣可以確保內存的有效利用。看下面的代碼:
public static void Main(string[] args) { string s = "abc"; Console.WriteLine(s); //輸出 abc Add(s); //調用下面方法 Console.WriteLine(s); //輸出 def Console.Read(); } public static void Add(string str) { str = "def"; } //改變方法的參數, 使用ref關鍵字,, public static void Main(string[] args) { string s = "abc"; Console.WriteLine(s); // 輸出 abc Add(ref s); Console.WriteLine(s); //abcdef Console.Read(); } public static void Add(ref string str) { str = "def"; }
設置StringBuilder容量
StringBuilder對象為動態字符串,可以對其設置好的字符數量進行擴展。另外,還可以設置一個最大長度,這個最大長度稱為該StringBuilder對象的容量(Capacity)。
為StringBuilder設置容量的意義在于,當修改StringBuilder字符串時,當其實際字符長度(即字符串已有的字符數量)未達到其容量之前,StringBuilder不會重新分配空間;當達到容量時,StringBuilder會在原空間的基礎之上,自動不進行設置,StringBuilder默認初始分配16個字符長度。有兩種方式來設置一個StringBuilder對象的容量。
1.使用構造函數
StringBuilder構造函數可以接受容量參數,例如,下面聲明一個StringBuilder對象sb2,并設置其容量為100。
//使用構造函數 StringBuilder Mysb1=new StringBuilder("Hello",100);
2.使用Capacity讀/寫屬性
Capacity屬性指定StringBuilder對象的容量,例如下面語句首先一個StringBuilder對象sb3,然后利用Capacity屬性設置其容量為100。
//使用Capacity屬性 StringBuilder Mysb2=new StringBuilder("Hello"); sb3.Capacity=100;
StirngBuilder的常用方法
1:StringBuilder.Append()
將內容追加到當前StringBuilder字符串的結尾。
public static void Main(string[] args){ StringBuilder Mysb = new StringBuilder("abc:"); Mysb.Append(" bcd"); Console.WriteLine(Mysb); // 輸出: abc:def Console.Read(); }
2:StringBuilder.AppendFormat()
。用一個帶格式文本來代替字符串要傳遞的符號。
static void Main(string[] args) { int Mysb1 = 100; StringBuilder Mysb2 = new StringBuilder("你欠我:"); Mysb2.AppendFormat("{0:C}", Mysb1); Console.WriteLine(Mysb2); // 輸出: 你欠我:¥100 Console.Read(); }
3:StringBuilder.Insert(int,string)
。
將字符串和對象插入到當前StringBuilder字符串的指定位置。使用此方法將一個單詞插入到 StringBuilder 的第六個位置。
static void Main(string[] args) { StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Insert(6, "插入"); Console.WriteLine(MyStringBuilder); //輸出為: Hello 插入World! Console.Read(); }
4:StringBuilder.Remove(p,n)
。在當前StringBuilder對象中移除指定的字符,就是說從p位置開始刪除n個字符
static void Main(string[] args) { StringBuilder Mysb = new StringBuilder("Hello World!"); Mysb.Remove(2,2); Console.WriteLine(MyStringBuilder); //輸出為:heo world Console.Read(); }
5:StringBuilder.Replace(a,b)
。就是用b替換a指定字符串,a和b都是字符或字符串。
static void Main(string[] args) { string a = "aaa.Baidu.com"; string b = a.Replace('a','w'); Console.WriteLine(b); // 輸出:www.Baidu.com }
實際上,當我們創建 StringBuilder 對象的時候,.NET 運行庫會為當前的對象在內存中分配一塊緩存區域,用以對字符串操作的預留空間。在使用 StringBuilder 類的時候,最好將容量設置為字符串可能的最大長度,確保 StringBuilder 不需要重復分配內存。如果字符的容量超過設置的最大容量,.NET 運行庫將自動分配內存并翻倍。
對于我們 .NET 程序員而言,StringBuilder 與 String 的不同之處就在于,StringBuilder 可以顯示的設置分配內存的大小,而 String 只能根據你初始化時的字符串的大小由系統分配足夠的內存。
所以,當要對字符串進行頻繁的操作的時候,在 String 和 StringBuilder 之間,我們應該選擇 StringBuilder。
以上就是String與StringBuilder在C#中有什么區別,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。