最近看完大话string之后深有感悟,虽然写c#不知不觉的已经写了四年了,但是很多原理也一直不太明白,最近看完这个才算略微明白了一些。
string类型有2个重要的特性,一致性和驻留性。
一致性就是说一个字符串一旦创建之后就会在内存的堆栈中开辟一块连续的空间,所以是不可修改的,如果对字符串修改的话,其实是创建了一个新的字符串,
然后旧的字符串没有被引用之后就会被gc回收掉。
string a="hello";
a+="wolrd";
此时字符串a在内存中的地址已经发生了改变。
一致性我之前也略微知道一些,我 估计大家也都会知道,但驻留性我之前倒是很少听过,驻留性说的是相同的字符串不会在堆栈中重复创建,会使用同一个引用地址,这也是引用类型的一大特点。因为clr有一个驻留表已键值对的形式保存着字符串的引用,每次会在这里查询。
string a="hello world";
string b="hello world";
在创建b的时候会在驻留表中查找值为hello world的key,如果有的话,将不会新建对象,而是指向已有对象。
但是这种情况就不会
string a="hello world";
string b="hello";
b=" world";
这里的a和b指向的就是不同的内存引用,因为动态修改后的字符串驻留表是无法保存的,除非指定保存才可以。