前言 首先和博園的各位打聲招呼,小弟在博園呆了也有一年多了。平常一有時間就會過來看看文章,學習各位的經驗,現在養成了一種一天不來博園,心裡就不踏實的習慣,不知道在看我博文的大哥們有沒有這個感覺。 讀歸讀,理解歸理解,所以我現在想把平常所看的,所讀的轉成自己的理解,記錄下來,以便與各位同行們討論討論。如果在我博文裡有理解錯誤的,或者沒有充分理解的請大膽指出,小弟先在這裡拜謝各位了。 客套話就說到這,下面開始今天的內容。 字符串 System.String類 System.Text.StringBuilder類 String string是各位用的最多的類型之一,是一個特殊的引用類型,直接派生於Object,因此它的值儲存在托管堆上。構造一個新字符串的時候,不需要用new。 復制代碼 using System; class Program { static void Main(string[] args) { string s = "This is right";//這是正確的 Console.WriteLine(s); string b = new String("This is error");//這是錯誤的 Console.WriteLine(b); } } 復制代碼 它是”不可變的“。初始化字符串對象後,該字符串對象的長度、內容都是確定不變的了。這個時候,我們需要更改或者添加字符串,會做一個怎樣的動作呢?假如會有這一段代碼 復制代碼 using System; class Program { static void Main(string[] args) { string s = "I am "; s += "Sky"; Console.WriteLine(s);//我叫Sky } } 復制代碼 1、創建一個新的字符串對象b,運行庫會為新對象b分配足夠的內存,儲存新內容“I am Sky”。 2、變量 s重新指向新對象b。 3、舊對象a沒有被任何變量引用,等待垃圾回收。 由於上面的特性,避免復制同一個字符串的多個對象,會利用CLR的字符串留用機制,減少內存的損耗。 什麼是字符串留用,CLR初始化的時候會創建哈希表,每構建一個新字符串都會與哈希表匹配,查找是否有相同的字符串,如果匹配,就會返回這個已存在的舊對象,由新變量進行引用。否則,就會創建一個字符串副本添加到哈希表裡,Key就是字符串,Value就是string對象在堆上的地址。 StringBuilder 因為string的”不可變“,導致多次修改字符串的時候會損耗性能,那麼這個時候StringBuilder的作用就來了。StringBuilder和String比起來,功能較少,只有基本的屬性和增刪改的方法。 其實,StringBuilder是由Char數組構成的。構建新的StringBuilder時能設置容量大小,當添加字符串,超過已分配的數組大小時,就會創建一個新的數組,此時容量會翻倍,舊的數據就會等待垃圾回收。 StringBuilder多數方法都是返回同一個StringBuilder對象,那麼這個時候就可以,幾個操作一起完成。 復制代碼 using System; using System.Text; class Program { static void Main(string[] args) { StringBuilder sb = new StringBuilder(10); string s = sb.AppendFormat("{0} {1}", "Skyer", "Chen").Remove(3,2).Replace(' ','-').ToString(); Console.WriteLine(s);//顯示結果 Sky-Chen } } 復制代碼