前言
首先和博園的各位打聲招呼,小弟在博園呆了也有一年多了。平常一有時間就會過來看看文章,學習各位的經驗,現在養成了一種一天不來博園,心里就不踏實的習慣,不知道在看我博文的大哥們有沒有這個感覺。
讀歸讀,理解歸理解,所以我現在想把平常所看的,所讀的轉成自己的理解,記錄下來,以便與各位同行們討論討論。如果在我博文里有理解錯誤的,或者沒有充分理解的請大膽指出,小弟先在這里拜謝各位了。
客套話就說到這,下面開始今天的內容。
字符串
-
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對象在堆上的地址。
由上面可見a和b的托管堆上地址是一樣的。假如用new呢?經小平子補充,new出來的字符串是不會記錄在哈希表的,因此,接下來的字符串與new出來字符串對象是不一樣的。
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 } }
寫到這里快江郎才盡了,小弟知識淺薄,日后若有長進定會補上。第一次寫博文格式排版有點爛,我發現在大牛們的格式特別漂亮。。起碼標題很顯眼,懇求各位哥指點指點。