字符串是一种引用类型,即使它具有值类型的大多数特征,例如不可变且具有==重载以比较文本而不是确保它们引用相同的对象。
那么为什么字符串不只是一个值类型?
字符串不是值类型,因为它们可能很大,并且需要存储在堆中。值类型(到目前为止,在CLR的所有实现中)都存储在堆栈中。堆栈分配字符串会破坏各种情况:对于32位,堆栈只有1MB,对于64位,堆栈只有4MB,您必须将每个字符串装箱,这会产生复制损失,您不能内在字符串,并且占用内存会气球等
(编辑:添加了关于值类型存储是实现细节的说明,这导致这种情况,即我们的类型具有不从System.ValueType继承的值语义。感谢Ben。)