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方法强制到驻留池中查找。