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方法強制到駐留池中查詢。