深究C#String與StringBuild的區別

前言:本博文,主要講解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類型對象的特點

  1. 它是引用類型,在堆上分配內存。
  2. 運算時會產生一個新的實例。
  3. String 對象一旦生成不可改變(Immutable)。
  4. 定義相等運算符(== 和 !=)是爲了比較 String 對象的值(而不是引用)。

2、String,StringBuilder類之間關係:
在這裏插入圖片描述

StringBuilder繼承自AbstractStringBuilder這個類,而AbstractStringBuilder和String都繼承自Object這個類(Object是所有C#類的超類)。

3、String是不可變類,StringBuilder是可變類

String本身是不可改變的,它只能賦值一次,每一次內容發生改變,都會生成一個新的對象,然後原有的對象引用新的對象,而每一次生成新對象都會對系統性能產生影響,這會降低.NET編譯器的工作效率。

StringBuilder類則不同,每次操作都是對自身對象進行操作,而不是生成新的對象,其所佔空間會隨着內容的增加而擴充,這樣,在做大量的修改操作時,不會因生成大量匿名對象而影響系統性能。

總結:String:適用於少量的字符串操作,字符串不經常發生變化的時,我們可以優先使用String

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章