String:
CLR可通过一个String对象共享多个完全一致的String内容。这样能减少系统中的字符串数量———从而节省内存——这就是所谓的"字符串留用"((string inteming)°。
MSDN文档将interming翻译成"拘留",专门供字符串留用的表称为"拘留池"。本书采用"留用"这一译法。这个技术的详情将在本章后面详细解释。
字符串池:
编译源代码时,编译器必须处理每个字面值(literal)字符串,并在托管模块的元数据中嵌入。同一个字符串在源代码中多次出现,把它们都嵌入元数据会使生成的文件无谓地增大。
为了解决这个问题,许多编译器(包括C#编译器)只在模块的元数据中只将字面值字符串写入一次。引用该字符串的所有代码都被修改成引用元数据中的同一个字符串。编译器将单个字符串的多个实例合并成一个实例,能显著减少模块的大小。但这并不是新技术,CC++编译器多年来一直在采用这个技术(Microsoft的C/C+编译器称之为"字符串池")。尽管如此,字符串池仍是提升字符串性能的另一种行之有效的方式,而你应注意到它的存在。
StringBuilder:
和String不同,StringBuilder代表可变(muable)字符串。也就是说,StrngBulider的大多数成员都能更改字符数组的内容,同时不会造成在托管堆上分配新对象。StringBuider只有以下两种情况才会分配新对象。
- 动态构造字符串,其长度超过了设置的"容量"。
- 调用 StringBuilder的 ToString 方法。