C# string
1、string 是不可變的
每次對string的修改,都相當于重新創建一個string對象(駐留池中沒有),返回引用。string是一個特殊的引用類型,具備值類型的特點。一般的引用類型,修改引用使其指向另一個對象,與修改引用對象的內容,是兩個完全不同的概念。但是,對于string類型,對string內容的修改,會導致指向另一個string對象。因此,對于字符串頻繁變化的情況,強烈建議使用StringBuilder
2、為什么把string設計成不可變的?
首先,string是程序中用到最多的類型,把string設計成不可變的,不會發生線程同步的問題。A線程訪問string變量str,把str傳遞給str2,線程B對str2的修改,不會影響str。
其次,把string設計成不可變的,意味著,內容相同的引用可以指向同一塊內存,節約內存。
3、怎么實現的?
CLR初始化創建一個哈希表,在這個表中,key是字符串,value是是對字符串的引用。當一個新的string對象,初始化為文本常量,首先檢查哈希表中是否包含該文本常量。如果包含,返回已經存在的引用。如果不包含,新建string對象,添加到哈希表,并返回引用。這樣,就避免了重復分配內存。除非卸載AppDomain或者進程終止,否則內部哈希表的string對象不能被釋放。
4、駐留池注意事項
只有文本常量的字符串才會進入駐留池,其他方式新建的字符串不會進入,也就是說,相同字符串在內存中可能會有多個拷貝。為了解決這個問題,可以使用String.Intern方法強制到駐留池中查找。
總結
- 上一篇: jQuery-Easyui 1.2 实现
- 下一篇: linux达人养成计划学习笔记(四)——