雖然大家對string和StringBuilder已經非常熟悉不過了,但是相信還是有好多人不是很懂他們的區別。看過好多大牛們寫的這方面的博客,受益匪淺,下面我也分享一下我的認識。
簡單說明
1.string是不可變的,一旦創建,就不可以修改。有人說:怎么就不可以修改了,string strTest = "hbccdf"; strTest = "緣生夢"; 這不就修改了strTest的值嗎
我的意思是,一旦在內存中創建了“hbccdf”,就不可通過是strTest[n] = "m"; 這種方式來修改字符的值,而 strTest="緣生夢"; 也並不是把 "hbccdf" 字符串修改為 “緣生夢”,而是,在內存中又創建了一個字符串“緣生夢”,然后將這個新的字符串的地址引用賦給strTest。
2.StringBuilder是可變的,創建后可以隨時修改,最終通過ToString返回一個字符串。與string的區別就是,StringBuilder sb = new StringBuilder(); sb.Append("hbccdf"); sb[0]="緣"; 那么通過sb.ToString(); 返回的字符串是什么呢? -- “緣bccdf” ,這是與string很大的不同。
那么為什么字符串通過索引不可以修改,而StringBuilder卻可以呢。我們通過類的定義來分析一下:
string的索引定義:public char this[int index] { [MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical] get; } ,由此可見,只有一個get,沒有set,所以strTest[0] = "緣"; 在編譯的時候就會報錯。
StringBuilder的索引定義:public char this[int index] { get; set; } ,get,set齊全,所以修改沒問題。
(二)引用類型string的值類型特點
下面來看一個小例子
string text = “White”; string temp = text; temp += “Black”; Console.WriteLine(text); Console.ReadKey();
想必大家都知道,最后輸出的會是:White
那么既然string是引用類型,那么temp += “Black”; temp的值會改變,那么text也應該會受到影響,然后最后輸出“WhiteBlack”。這到底是為什么呢?
+=操作究竟做了什么事情呢:
+= 操作是 根據兩個字符串來創建一個新的字符串對象,然后將這個新的字符串對象的引用賦給 temp。這個操作並沒有影響之前的 text,所以輸出 White。
