除了性能和可读性之外,为什么System.String是引用类型而不是值类型还有其他原因吗?

Liv*_*foi 8 c# string value-type

为什么String被设计为引用类型而不是值类型?

从建模的角度来看,我会将它建模为一个值类型,因为它表示没有身份的东西.它没有区别属性.(例如,我不能在一个字符串"a"和另一个字符串"a"之间产生任何区别)

我知道如果长字符串存储在堆栈中,我会遇到严重的性能问题.可能这是不可能的,因为字符串变得很长,因为堆栈的大小有限.

如果它不是为了性能,你为什么要将System.String设计为引用类型?(假设任何可能的字符串最多为16个字节)

Bri*_*sen 5

正如您所指出的那样,由于有限的堆栈空间和值类型的复制使用语义,可能会变得非常庞大的值类型可能会令人望而却步.

此外,在.NET中实现字符串的方式为方程式添加了几个元素.字符串不仅是引用类型,它们也是不可变的(无论如何都在System命名空间之外),运行时使用interning来为字符串做巧妙的技巧.

所有这些都增加了几个好处:重复的文字字符串只存储一次,并且这些字符串的比较变得非常有效,因为您可以比较引用而不是Unicode字符流.对于值类型,这些选项是不可能的.


Mar*_*ell 2

结构需要固定大小。string[]例如,考虑 a 。作为值类型的唯一方法string是仅存储指针。这本质上就是我们通过使用引用类型实现的。

当然,我们不必在每次分配字符串时都复制该字符串,这也是非常有益的。