string 與String的區別

來源:互聯網
上載者:User

在實際的開發過程中,對字串的操作是經常遇到的,其中涉及到字串拼接、拆分、比較、替換等操作。C#提供了string類型,String和StringBuilder兩種類來對字串進行處理。那麼string,String,StringBuilder對字串進行處理有何異同,在實際編程中,對於不同的字串操作應該採用哪種方式來提高程式的效率呢?本文將對string,String,StringBuilder進行詳細的解釋和比較,最後在編程過程中遇到的常用的字串處理進行了總結。

  首先理解string,String,StringBuilder的概念和區別

  string

  string,msdn給出的解釋就是,string 是C#中的關鍵字,並且是參考型別, string 類型表示零或更多 Unicode 字元組成的序列。string 是 .NET Framework 中 String 的別名。但定義相等運算子(== 和 !=)是為了比較 string 對象(而不是引用)的值(後面給出樣本解釋這點)。

  String:

  String是類,表示文本,即一系列 Unicode 字元。String 對象是不可改變的。每次使用 System.String 類中的方法之一時,都要在記憶體中建立一個新的字串對象,這就需要為該新對象分配新的空間。如:當我們執行個體化一個String的對象後,在記憶體中為此對象分配一個空間。如下:String str = “hello”;當我們修改str的值的時候,如:str = “hello world”;此時,系統會為str重新分配一個空間。這樣原來的記憶體空間就被浪費掉了,只能等待記憶體回收行程回收。在需要對字串執行重複修改的情況下,與建立新的 String對象相關的系統開銷可能會非常昂貴。

  String與string的區別:

  string 是 .NET Framework 中 String 的別名,string是C#基元類型(primitive),簡單來說就是編譯器直接支援的資料類型。基元類型要直接映射到Framework類庫(FCL)中的類型,例如,C#中一個基元類型int直接映射到System.Int32類型,這裡int是基元類型,System.Int32是FCL類型。而String是FCL類型的,所以在C#的編譯時間,會自動的把string轉化為System.String。所以string與String實質上沒什麼區別,只是在使用string要做一次轉換,轉換為String。因此,在編碼時我們推薦使用String。

  string雖然為參考型別,但是(== 和 !=)是為了比較 string 對象(而不是引用)的值。

  如:

 string a = "hello";
  string b = "hel";
  b = b + "lo";
  string c = "hello";
  Response.Write(a==b); //True
  Response.Write((object)a == (object)b); //False
  Response.Write((object)a == (object)c); //True

   a==b比較的是值而非引用。所以a==b為True。當建立多個字串內容相同的對象時,都只會指向同一個引用; a和c都指向同一個a的引用,並不會為c重新分配記憶體;這樣即可保證記憶體有效利用;所以上面的(object)a == (object)c比較的是a與c的引用,結果為True。這裡面b由於進行了累加操作(b = b + "lo";)b又重新分配了記憶體,所以(object)a == (object)b比較的是引用,所以為False。

  接下來我們再通過幾個例子來理解下String(string)

 String str1 = "abc";
  String str2 = str1;
  str1 = "123";
  Response.Write(str2);//abc

  輸出結果是abc,首先給str賦值為"abc",接著執行str2 = str1,使str2和str1指向同一引用,即記憶體位址。當執行str1 = "123"後,String對象是不可改變的,實質上str1 = "123"是str1=new string("123")的簡寫,它的每一次賦值都會拋掉原來的對象而產生一個新的字串對象,分配新的記憶體空間,str1 = "123"語句編譯器私底下建立了一個新的字串對象來儲存新的字元序列"123",也就是此str1已非彼str1了。因此str1的值的改變也就不能影響先前str1指向地址的值了,當然str2的值也就不會改變了。因此string是不可改變的。

  通過上面的例子,如果我們執行下面這些語句:

String sql = “Select * From T_Test ”;
  sql += “Where id=888 ”;
        sql += “And type=3 ”;
  sql += “Order By Desc”;

  實際上這樣是十分浪費記憶體空間的。如果是頻繁的這樣做的話,建議是使用StringBuilder對象,或者這樣寫:String sql = “Select * From T_Test” + “Where id=888 ” + “And type=3” + “Order By Desc ” ;

  StringBuilder:

  出於效能方面的考慮,大量的串聯或所涉及其他字串操作應通過StringBuilder類來執行。StringBuilder表示可變字元字串, 它允許我們有效對字串的字元執行動態操作,有效縮減字串的大小或者更改字串中的字元。如果字串變大,超過已經分配的字元的大小,StringBuilder就會自動的分配一個全新的、更大的數組,並開始使用新的數組,雖然 StringBuilder 對象是動態對象,允許擴充它所封裝的字串中字元的數量,但是您可以為它可容納的最大字元數指定一個值。此值稱為該對象的容量,不應將它與當前 StringBuilder 對象容納的字串長度混淆在一起。例如,可以建立 StringBuilder 類的帶有字串“Hello”(長度為 5)的一個新執行個體,同時可以指定該對象的最大容量為 25。當修改 StringBuilder 時,在達到容量之前,它不會為其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍。可以使用重載的建構函式之一來指定 StringBuilder 類的容量。

  String 或 StringBuilder 對象的串聯操作的效能取決於記憶體配置的發生頻率。String 串聯操作每次都分配記憶體,而 StringBuilder 串聯操作僅當 StringBuilder 對象緩衝區太小而無法容納新資料時才分配記憶體。因此,如果串聯固定數量的 String 對象,則 String 類更適合串聯操作。這種情況下,編譯器甚至會將各個串聯操作組合到一個操作中。如果串聯任意數量的字串,則 StringBuilder 對象更適合串聯操作;例如,某個迴圈對使用者輸入的任意數量的字串進行串聯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.