|
系列文章導(dǎo)航:
[你必須知道的.NET] 第二回:對(duì)抽象編程:接口和抽象類(lèi)
[你必須知道的.NET] 第四回:后來(lái)居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說(shuō)透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類(lèi)型---從通用類(lèi)型系統(tǒng)開(kāi)始
[你必須知道的.NET] 第八回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(中)-規(guī)則無(wú)邊
[你必須知道的.NET] 第十回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開(kāi)始認(rèn)識(shí)IL
[你必須知道的.NET] 第十四回:認(rèn)識(shí)IL代碼---從開(kāi)始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十七回:貌合神離:覆寫(xiě)和重載
[你必須知道的.NET] 第十八回:對(duì)象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對(duì)象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識(shí)全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問(wèn)題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問(wèn)題思考
![]() |
走鋼絲的人,在刺激中體驗(yàn)快感。帶著問(wèn)題思考,在問(wèn)題上迸發(fā)火花。 或者給問(wèn)題以答案,或者給答案以問(wèn)題,你可能永遠(yuǎn)無(wú)法看清全部,但是總能從一點(diǎn)突破很多。事實(shí)的關(guān)鍵就在于面對(duì)問(wèn)題,我該如何思考? String Interning(字符串駐留)就是這樣一個(gè)值得思考的話題,帶著問(wèn)題思考,我們至少要理清以下幾個(gè)問(wèn)題:
帶著幾個(gè)問(wèn)號(hào),你必須知道的.NET,繼續(xù)更多體驗(yàn)。 |
系列文章導(dǎo)航:
[你必須知道的.NET] 第二回:對(duì)抽象編程:接口和抽象類(lèi)
[你必須知道的.NET] 第四回:后來(lái)居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說(shuō)透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類(lèi)型---從通用類(lèi)型系統(tǒng)開(kāi)始
[你必須知道的.NET] 第八回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(中)-規(guī)則無(wú)邊
[你必須知道的.NET] 第十回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開(kāi)始認(rèn)識(shí)IL
[你必須知道的.NET] 第十四回:認(rèn)識(shí)IL代碼---從開(kāi)始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十七回:貌合神離:覆寫(xiě)和重載
[你必須知道的.NET] 第十八回:對(duì)象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對(duì)象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識(shí)全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問(wèn)題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
2 欲求思考
欲求思考,則從基本開(kāi)始,對(duì)于理解整個(gè)string intern機(jī)制是大有裨益的,因此深入的第一步就從基本概念開(kāi)始。隨著我們分析的層層深入,就會(huì)發(fā)現(xiàn)看似曲折的結(jié)果,原來(lái)不過(guò)如此而已,這正是技術(shù)探求的最佳方式。
什么是string
什么是string呢,提起這個(gè)問(wèn)題,我想下面的圖例可以給出一點(diǎn)啟示:
string在本質(zhì)上就是一連串的有順序的字符集合。
簡(jiǎn)單的說(shuō),string就是char[],而在.NET中string頭一回具有了類(lèi)的概念,暗合了.NET一切皆為對(duì)象的大一統(tǒng)格局?;貧w本質(zhì),我們重新審視如此另類(lèi)而多彩的string,你會(huì)不禁明白,string本質(zhì)上就是一個(gè)16位Unicode字符數(shù)組。打開(kāi)string的Disassemble代碼,我們可直擊其本質(zhì):
[Serializable, ComVisible(true)]
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>,
IEnumerable<char>, IEnumerable, IEquatable<string>
{
}
系列文章導(dǎo)航:
[你必須知道的.NET] 第二回:對(duì)抽象編程:接口和抽象類(lèi)
[你必須知道的.NET] 第四回:后來(lái)居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說(shuō)透
[你必須知道的.NET] 第六回:深入淺出關(guān)鍵字---base和this
[你必須知道的.NET] 第七回:品味類(lèi)型---從通用類(lèi)型系統(tǒng)開(kāi)始
[你必須知道的.NET] 第八回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(上)-內(nèi)存有理
[你必須知道的.NET] 第九回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(中)-規(guī)則無(wú)邊
[你必須知道的.NET] 第十回:品味類(lèi)型---值類(lèi)型與引用類(lèi)型(下)-應(yīng)用征途
[你必須知道的.NET] 第十一回:參數(shù)之惑---傳遞的藝術(shù)(上)
[你必須知道的.NET] 第十二回:參數(shù)之惑---傳遞的藝術(shù)(下)
[你必須知道的.NET] 第十三回:從Hello, world開(kāi)始認(rèn)識(shí)IL
[你必須知道的.NET] 第十四回:認(rèn)識(shí)IL代碼---從開(kāi)始到現(xiàn)在
[你必須知道的.NET] 第十六回:深入淺出關(guān)鍵字---using全接觸
[你必須知道的.NET] 第十七回:貌合神離:覆寫(xiě)和重載
[你必須知道的.NET] 第十八回:對(duì)象創(chuàng)建始末(上)
[你必須知道的.NET] 第十九回:對(duì)象創(chuàng)建始末(下)
[你必須知道的.NET]第二十回:學(xué)習(xí)方法論
[你必須知道的.NET]第二十一回:認(rèn)識(shí)全面的null
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問(wèn)題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
什么是字符串駐留(String Interning)
回歸經(jīng)典,我們首先給出MSDN對(duì)于字符串駐留的一點(diǎn)討論:
公共語(yǔ)言運(yùn)行庫(kù)通過(guò)維護(hù)一個(gè)表來(lái)存放字符串,該表稱(chēng)為拘留池,它包含程序中以編程方式聲明或創(chuàng)建的每個(gè)唯一的字符串的一個(gè)引用。因此,具有特定值的字符串的實(shí)例在系統(tǒng)中只有一個(gè)。
例如,如果將同一字符串分配給幾個(gè)變量,運(yùn)行庫(kù)就會(huì)從拘留池中檢索對(duì)該字符串的相同引用,并將它分配給各個(gè)變量。
之所以,將string這個(gè)熟悉的命題拿出來(lái)造輪子,并不是再造個(gè)輪子自己陶醉。關(guān)于string的輪子,實(shí)在太多了,而且個(gè)個(gè)不順眼,它就像編程的精靈,四處可見(jiàn)隨處都有。string是如此的重要,以至于CLR必須以特殊的方式來(lái)實(shí)現(xiàn)對(duì)string類(lèi)型的管理、存取和布局,在這些復(fù)雜的特殊表象中,字符串駐留機(jī)制是string特殊性的集中體現(xiàn),它的基本原理可以概括為:
- CLR維護(hù)一個(gè)類(lèi)似于哈希表的內(nèi)部結(jié)構(gòu),用于維護(hù)對(duì)于字符串的統(tǒng)一管理。
- 但JIT編譯時(shí),CLR首先查找哈希表,如果沒(méi)有找到匹配的字符串記錄,則在托管堆中創(chuàng)建新的string實(shí)例,并為哈希表添加一個(gè)鍵值對(duì)記錄;下一次查找相同string時(shí),則只返回該記錄的值給第二次創(chuàng)建的string對(duì)象。
- 通過(guò)這種方式,字符串駐留機(jī)制有效實(shí)現(xiàn)了對(duì)string的池管理,節(jié)省了大量的內(nèi)存空間。
詳細(xì)的字符串駐留機(jī)制,敬請(qǐng)參考:
![]() |
關(guān)于字符串駐留機(jī)制的詳細(xì)過(guò)程,不是本文所要解決的主要問(wèn)題,你可以參考:
|
NET技術(shù):[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問(wèn)題思考,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。