常見的.net誤解 1-1 字符串是不可修改的(immutable)
總是很在很多資料或者文章上介紹.net的字符串是不可以修改的?(?immutable)
先來看看什么是字符串
在.net里面字符串是一個(gè)引用類型,但是有很多值類型的特征
例如比較兩個(gè)字符串,實(shí)際上比較的是兩個(gè)的內(nèi)容,而不是引用地址 ,(這里涉及到一個(gè)概念就是字符串駐留技術(shù))
然后我們看看為什么經(jīng)常有人說字符串是不可以修改的
因?yàn)樽址幸韵绿匦?
- 當(dāng)你對(duì)字符串執(zhí)行 + , Substring 等操作的時(shí)候,會(huì)返回一個(gè)新的字符串,
- 一般情況下你找不到可以修改字符串的方法,(直接給他賦值不過是修改一個(gè)地址,原來的值并沒有變)
- 最主要的 c#中的字符串表現(xiàn)出太多值類型的特征
如何修改字符串
參考以下代碼:
定義一個(gè)指向字符串的指針,根據(jù)地址直接修改值
unsafe
{
string s1 = "1 test string";
fixed (char* p = s1)
{
*p = '2';
}
Console.WriteLine(s1);
}
關(guān)于字符串駐留
一個(gè)字符串一般來說在內(nèi)存中只有一個(gè)實(shí)例, 也就是一個(gè)字符串是可以同時(shí)用在多個(gè)地方的
那么修改了一個(gè)字符串的內(nèi)容,其他的字符串也會(huì)同時(shí)受到影響,參考以下代碼: 修改s1的同時(shí) s2也被修改了
unsafe
{
string s1 = "1 test string";
string s2 = "1 test string";
fixed (char* p = s1)
{
*p = '2';
}
Console.WriteLine(s1);
Console.WriteLine(s2);
}
PS1:字符串駐留是一種很有意思的技術(shù),在以后的章節(jié)我們可以詳細(xì)討論這一點(diǎn)
PS2:直接修改字符串是一個(gè)非常危險(xiǎn)的行為, 1.他會(huì)影響到整個(gè)應(yīng)用程序中用到這個(gè)字符串的地方,2.不小心會(huì)覆蓋到字符串外的其他地方(字符串在內(nèi)存中的表現(xiàn)形式 之后介紹)
PS3:字符串在內(nèi)存中的分布形式
.net字符串在內(nèi)存中由3個(gè)部分組成
1. 4B 一個(gè)int的值代表這個(gè)字符串有多長(zhǎng) (低位在前)
a) 在比較字符串的時(shí)候,內(nèi)部?jī)?yōu)化的結(jié)果就是先比較這個(gè)長(zhǎng)度, 如果不一樣,則立刻返回false ,否則繼續(xù)檢查內(nèi)容
b)這是一個(gè)int值 暗示著在32位系統(tǒng)上 字符串的最大長(zhǎng)度就是int的最大值,大約2g
c)如果你要修改的字符串長(zhǎng)度改變了原來的長(zhǎng)度,例如 "a" -> "a1" ,請(qǐng)記得修改這個(gè)值....否則你會(huì)發(fā)現(xiàn)修改后的字符串?dāng)嗟袅?/p>
2. 字符串本身的內(nèi)容(Unicode-16編碼)
3. 4B 字符串結(jié)束符(\0) (對(duì)于這個(gè)問題其實(shí)我也有一些疑問, 其實(shí)這個(gè)在.net中并不重要,其實(shí)沒有他也一樣ok)
未完待續(xù)(剛剛開始用博客園....居然發(fā)現(xiàn)C#分類是灰色的 選不了...不知道怎么回事)
posted on 2010-11-12 17:29 聽說讀寫 閱讀(1621) 評(píng)論(7) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)