這邊記錄一下關於 String 的一些小知識
基本介紹
字串是用來代表文字字元的循序集合。
String 物件在記憶體中的大小上限是 2 GB 的資料或大約 1 億個字元。
String 物件是循序集合 System.Char 物件來代表的字串,而 System.Char 物件會對應至的 utf-16 字碼單位。
也因為 String 物件是循序集合的內容,其 System.Char 物件和值是不可變 (亦即,String 是唯讀),一旦建立後便無法修改其值,所以任何操作 String 的行為實際上是會傳回新 String。
舉個例子:字串相加其實是字串處理完畢後重新指派,而非原字串拼接新字串。
如果需要以拼接的方式連接字串,則可以使用 StringBuilder。
StringBuilder
StringBuilder 是可變動的物件,當您串連、附加或刪除從字串的子字串時,作業將會在單一字串。
當您完成修改的值 StringBuilder 物件,您可以呼叫其 StringBuilder.ToString 方法將它轉換成字串。
String 效能不一定比 StringBuilder 差,可以看下面的參考連結查看比較,雖然文章有歷史了,有興趣的也可以自己實測。
Null 檢查
String 類別包含下列兩個便利的方法可讓您測試字串是否 null 或空白:
IsNullOrEmpty 表示字串是是否 null 或等於 String.Empty。 這個方法就不需要使用程式碼,如下所示:
1
if (str == null || str.Equals(String.Empty))
IsNullOrWhiteSpace 表示字串是否 null,等於 String.Empty,或只包含泛空白字元。 這個方法就不需要使用程式碼,如下所示:
1
if (str == null || str.Equals(String.Empty) || str.Trim().Equals(String.Empty))
在 FB 台灣 .NET 技術愛好者俱樂部 看到有人說明使用 string 來進行字串相加的問題。
字串相加,在記憶體的操作不是原字串去擴展,而是宣告另一塊記憶體空間要等於2個字串相加後的大小,然後把2個字串複製填入這塊新宣告的記憶體,再把指標指向這塊新的記憶體。而舊的2個字串會等到GC啟動後才釋放。如果你頻繁的做字串相加,那就是一直在做記憶體複製,然後也會引發頻繁的GC,系統效能自然會差,且若相加到大於85,000 bytes(85k),會被放到LOH,也就意味著不會釋放,當你達到一個臨界點(取決於32/64 bit與可用記憶體空間),就會造成Out of memory的問題
如果一定要做長字串的相加處理,StringBuilder會是你的好朋友,輸入輸出時要看你用途,如果可以的話,儘可能用Stream相關類別來減少記憶體複製造成的效能損耗與避免重複產生LOH(Large Object Heap)
Jed Lin 大大
參考資料
String Class (System) Microsoft Docs
String與Stringbuilder組字串的效能比較 Jeff 隨手記 - 點部落