首先,我們要知道的是String類型是一個引用類型,它的基類是Object。並且它的內容是只讀的。
我們有時候經常會看到兩個字符串類型,一個是“Sting”,一個是“string”。大寫的String是System.String,也就是 公共語言規范(Common Language Specification) CLS 所定義的字符串類型;小寫的string則是C#自己的字符串類型;最終C#編譯器還是會把它和System.String聯系起來。
例如:
a = = ;
我們來簡單分析下這兩段代碼:
1.第一段代碼,首先會在托管堆上分配一塊內存,用來存儲“a”,然後將該對象的首地址保存到變量a中。(如果駐留池中有“a”,就可以直接取出)
2.第二段代碼,會在托管堆上重新分配一塊內存,用來儲存“abc”,然後修改變量a的值,使它指向該對象的首地址。
需要注意的是,string類型提供了許多的靜態和實例的方法,比如ToUpper,Concat等;這些方法都返回一個新的字符串。這些新的字符串要麼是新建的,要麼是從字符串駐留池中去出來的,與原字符串無關。
好了,現在讓我們來看看“字符串駐留池”(Intern Pool)。顧名思義,凡是看到什麼什麼池之類的東西,都能猜到字面肯定存著許多對象,就是為了反復使用,避免我們自己重新new。每個進程都有自己的字符串駐留池,所以i它們之間互不影響。
我們先來看一個例子:
a1 = a2 = ; a3 = (,
我們運行完這段代碼之後就可以得到,第一輸出True,第二個輸出False。輸出True,是因為直接使用的駐留池中的字符串;但是為什麼第二個輸出是False呢?
因為:CLR在程序執行的時候,首先會把嵌入到源代碼中的文本常量字符串加入到“字符串駐留池”中;但是,程序中動態創建的字符串卻不會被加入。