一尘不染

在C#中,为什么String是行为类似于值类型的引用类型?

c#

字符串是一种引用类型,即使它具有值类型的大多数特征,例如不可变且具有==重载以比较文本而不是确保它们引用相同的对象。

那么为什么字符串不只是一个值类型?


阅读 441

收藏
2020-05-19

共1个答案

一尘不染

字符串不是值类型,因为它们可能很大,并且需要存储在堆中。值类型(到目前为止,在CLR的所有实现中)都存储在堆栈中。堆栈分配字符串会破坏各种情况:对于32位,堆栈只有1MB,对于64位,堆栈只有4MB,您必须将每个字符串装箱,这会产生复制损失,您不能内在字符串,并且占用内存会气球等

(编辑:添加了关于值类型存储是实现细节的说明,这导致这种情况,即我们的类型具有不从System.ValueType继承的值语义。感谢Ben。)

2020-05-19