香蕉视频app

Keep on going never give up.

Let's Go

C# 學習筆記(32)StringBuilder類

C#Lonely2019-05-14 17:32:4259次0條

我們都知道string類型具有不可變性,對字符串進行操作的方法實際上返回的是新的字符串對象。 每次使用 System.String 類中的方法之一,都要在內存中創建一個新的字符串對象,這就需要為新對象開辟一塊內存空間。 當我們在程序當中需要進行大量重復修改字符串的情況下,每次都新建 String 對象關聯的開銷可能會非常大。為了避免產生大量的垃圾,在我們需要修改字符串(而不創建新對象)的時候,可以使用 System.Text.StringBuilder 類。 例如,如果在循環中將許多字符串連接在一起,使用 StringBuilder 類可以提升性能。

StringBuilder與string的效率對比

代碼示例:

string str = string.Empty;
Stopwatch sw = new Stopwatch(); //創建一個計時器,用來記錄程序運行的時間。
sw.Start(); //開始計時
for (int i = 0; i < 100000; i++)
{
    str += i.ToString();
}
sw.Stop(); //結束計時
Console.WriteLine(sw.Elapsed); //輸出計時時間
Console.ReadKey();
//該程序在我的電腦上運行總耗時 00:00:21.0492830 秒
StringBuilder sb = new StringBuilder();
Stopwatch sw = new Stopwatch(); //創建一個計時器,用來記錄程序運行的時間。
sw.Start(); //開始計時
for (int i = 0; i < 100000; i++)
{
    sb.Append(i.ToString());
}
sw.Stop(); //結束計時
Console.WriteLine(sw.Elapsed); //輸出計時時間
Console.ReadKey();
//該程序在我的電腦上運行總耗時 00:00:00.0177520 秒

由上運行結果可見,StringBuilder效率要比string高,在對字符串進行頻繁修改的情況下,如在For循環中進行操作等,那么將會頻繁的創建新的字符串對象,造成系統的不必要開銷,所以這種情況下推薦大家都使用StringBuilder類來對字符串進行操作。


StringBuilder的使用方法

實例化StringBuilder對象

通過使用重載的構造函數方法之一初始化變量,可以創建 StringBuilder 類的實例,如下面的示例所示。

StringBuilder sb = new StringBuilder("Hello World!");

設置容量和長度

香蕉视频app雖然 StringBuilder 是動態對象,支持擴展它封裝的字符串中的字符數,但可以指定值,作為對象可保留的字符數上限。 此值稱為“對象容量”,不得將它與當前 StringBuilder 保留的字符串長度相混淆。 StringBuilder類,默認的容量大小是16,意思就是說我們如果不指定StringBuilder容量,超過16個長度,就會重新去分配一次內存。例如,可以使用長度為 5 的字符串“Hello”創建 StringBuilder 類的實例,同時可以指定此對象的最大容量為 25。 修改 StringBuilder 時,除非達到容量,否則對象不會為自己重新分配空間。 當達到容量時,將自動分配新的空間且容量翻倍。 可以使用重載的構造函數之一,指定 StringBuilder 類的容量。 下面的示例指定可以將 myStringBuilder 對象增加到最多 25 個空間。

StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25);

香蕉视频app另外,還可以使用讀/寫 Capacity 屬性,設置對象的長度上限。 下面的示例使用 Capacity 屬性來定義對象的最大長度。

myStringBuilder.Capacity = 25;

香蕉视频appEnsureCapacity 方法可用于檢查當前 StringBuilder 的容量。 如果容量大于傳遞的值,則不進行任何更改;但是,如果容量小于傳遞的值,則會更改當前的容量以使其與傳遞的值匹配。也可以查看或設置 Length 屬性。 如果將 Length 屬性設置為大于 Capacity 屬性的值,則自動將 Capacity 屬性更改為與 Length 屬性相同的值。 如果將 Length 屬性設置為小于當前 StringBuilder 對象內的字符串長度的值,則會縮短該字符串。


Append方法:將信息追加到當前 StringBuilder 的末尾。

StringBuilder sb = new StringBuilder("Hello,World!");
//追加對應的字符串
Console.WriteLine(sb.Append("哈哈哈")); //輸出 Hello,World!哈哈哈

Insert方法:將字符串或對象插入到當前 StringBuilder 的指定索引中。

StringBuilder sb = new StringBuilder("0123456");
//在對應位置插入指定的字符串
Console.WriteLine(sb.Insert(3, "哈哈")); //輸出 012哈哈3456

Remove方法:從當前 StringBuilder 中刪除指定數量的字符。

StringBuilder sb = new StringBuilder("0123456");
//移除從索引開始位置的N個字符
Console.WriteLine(sb.Remove(3, 2)); //輸出 01256

Replace方法:替換指定索引處的指定字符。

StringBuilder sb = new StringBuilder("我真帥");
//替換
Console.WriteLine(sb.Replace("真", "非常")); //輸出 我非常帥

AppendFormat方法:用帶格式文本替換字符串中傳遞的格式說明符。

StringBuilder sb = new StringBuilder("我的工資為:");
//按照指定的格式來添加對應的字符串
int num = 1024;
Console.WriteLine(sb.AppendFormat("{0:C}元", num)); //輸出 我的工資為:¥1,024.00元

AppendLine方法:將默認的行終止符追加到當前 StringBuilder 對象的末尾。

StringBuilder sb = new StringBuilder("嚶嚶嚶");
//將默認的行終止符追加到當前 StringBuilder 對象的末尾。
Console.Write(sb.AppendLine("我居然被換行了"));
Console.Write("哦豁");
//輸出結果:
//嚶嚶嚶我居然被換行了
//哦豁

將 StringBuilder 對象轉換為字符串

香蕉视频app必須先將 StringBuilder 對象轉換為 String 對象,然后才能將 StringBuilder 對象表示的字符串傳遞給包含 String 參數的方法,或在用戶界面中顯示它。 可通過調用 StringBuilder.ToString 方法來執行此轉換。 

StringBuilder sb = new StringBuilder("你的代碼寫的真像蔡徐坤!");
string str = sb.ToString();
Console.WriteLine(str); //輸出 你的代碼寫的真像蔡徐坤!
Console.WriteLine(sb.ToString()); //輸出 你的代碼寫的真像蔡徐坤!
Console.ReadKey();




暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!