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

时间:2010-06-25 07:30:37

标签: c# string value-type

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

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

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

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

6 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

当然,每次分配时都不会复制字符串,这也非常有益。

答案 2 :(得分:1)

我的理解是字符串是不可变类而不是结构作为性能增益。

通常会创建字符串,然后传递给许多对象以呈现给用户或传递给其他系统。创建后,字符串不会改变,因此将整个字符数组作为唯一值复制到每个对象中几乎没有实际价值,并创建了大量临时对象。

答案 3 :(得分:1)

简单 - 因为每次将一个字符串传递给方法时我都不想复制字符串。它需要更多的内存,而且需要更多的时间。

答案 4 :(得分:0)


  • 〜编辑更准确地回答问题

有一点是像许多语言一样的String类型被编码为Unicode,因此将它们视为基本类型(如int)是不合逻辑的,因为它的二进制编码与其人类读取之间没有直接的对应关系形成。

Unicode层自动限定字符串类型从二进制文件中抽象出来,而数字在基础2(二进制)和基数10(十进制)形式之间可以相对容易地互换。

原始变量可以驻留在堆栈上的原因是,有很多空间可用于大量数字。对于更多数据重 String类型,情况并非如此。

对字符串执行的操作类型并不是真正的算术,而是基于布尔逻辑(除非在将字符串视为向量或数组时对其进行计数),因此优化数据结构以实现其主要用途是有意义的,通过System.String命名空间。

答案 5 :(得分:0)

在平等方面,您仍然可以将其视为==的值类型 操作

所以,如果有的话,将它作为参考号是没有优势的吗?