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