前言:本博文,主要講解C#String與StringBuild的區別,更多內容請參考:C# 字符串(String)精講、關於C#String與StringBuild的介紹
一、兩者區別概述
首先,我們要明確,String
是引用類型,一旦賦值,值是不可改變的。每次使用System.String
類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要爲該新對象分配新的空間。在需要對字符串執行重複修改的情況下,與創建新的String
對象相關的系統開銷可能會非常昂貴。如果要修改字符串而不創建新的對象,則可以使用System.Text.StringBuilder
類。例如,當在一個循環中將許多字符串連接在一起時,使用StringBuilder
類可以提升性能。
二、通過例子分析下
string str="1234";
string str1="5678";
str=str+str1;
這時候str變成了"12345678"。
表面上看好像是字符串"1234"變成了"12345678",其實不是的。
String是引用類型,一開始str引用了內存中"1234"的地址,執行str+str1的時候,實際上是在內存中重新生成了一個"12345678"的String變量,而不是在原來的"1234"上增加一段,然後再把str的引用設置到新的"12345678"上。
而StringBuilder不同,它可以在原來的字符串末尾加上新的字符串。
三、深入認識StringBuilder
StringBuilder
是一個可以拼接字符串的類,初始化時可以指定StringBuilder
對象一個長度,StringBuilder
中有一個int類型的Capacity屬性,用來指定StringBuilder
中容器的長度。StringBuilder
提供一個append(string str)方法用於拼接字符串,並且可以自動檢測字符串長度,當長度超過之前指定的最大長度時,會自動增加一個Capacity的長度。所以在進行大量字符串拼接時,應該使用StringBuilder
對象。
四、回看兩個類型
1、String類型對象的特點
- 它是引用類型,在堆上分配內存。
- 運算時會產生一個新的實例。
- String 對象一旦生成不可改變(Immutable)。
- 定義相等運算符(== 和 !=)是爲了比較 String 對象的值(而不是引用)。
2、String,StringBuilder類之間關係:
StringBuilder繼承自AbstractStringBuilder這個類,而AbstractStringBuilder和String都繼承自Object這個類(Object是所有C#類的超類)。
3、String是不可變類,StringBuilder是可變類
String
本身是不可改變的,它只能賦值一次,每一次內容發生改變,都會生成一個新的對象,然後原有的對象引用新的對象,而每一次生成新對象都會對系統性能產生影響,這會降低.NET編譯器的工作效率。
StringBuilder
類則不同,每次操作都是對自身對象進行操作,而不是生成新的對象,其所佔空間會隨着內容的增加而擴充,這樣,在做大量的修改操作時,不會因生成大量匿名對象而影響系統性能。
總結:String:適用於少量的字符串操作,字符串不經常發生變化的時,我們可以優先使用String
。