string是一个引用类型,其对象值存储在托管堆中。string内部是一个char集合,其长度Length是char字符数组的长度。
字符串是不可变的,任何改变都会产生新的字符串
CLR提供了字符串驻留
相同的字符串在内存中只分配一次,第二次申请字符串时,找到已经申请过的字符串,会直接返回已有的字符串
字符串驻留原理: •CLR初始化时会在内存中创建一个驻留池,内部其实是一个哈希表,存储被驻留的字符串和其内存地址。 •驻留池是进程级别的,多个AppDomain共享。同时她不受GC控制,生命周期随进程,意思就是不会被GC回收 •当分配字符串时,首先会到驻留池中查找,如找到,则返回已有相同字符串的地址,不会创建新字符串对象。如果没有找到,则创建新的字符串,并把字符串添加到驻留池中。
不是任何字符串都会驻留,只有通过IL指令ldstr创建的字符串才会留用。 那该如何来验证字符串是否驻留呢,string类提供两个静态方法: •String.Intern(string str) 可以主动驻留一个字符串; •String.IsInterned(string str);检测指定字符串是否驻留,如果驻留则返回字符串,否则返回NULL
StringBuilder不会创建大量的新对象
StringBuilder在追加字符串时,当字符串总长度超过当前设置的容量Capacity,会重新创建一个更大的字符数组。 调用StringBuilder.ToString(),创建新的字符串
在大量的使用字符串连接的时候,使用StringBuilder。