String是一种引用类型,尽管它具有值类型的大多数特征,例如不可变和重载==以比较文本,而不是确保它们引用同一个对象。
为什么字符串不只是一个值类型呢?
String是一种引用类型,尽管它具有值类型的大多数特征,例如不可变和重载==以比较文本,而不是确保它们引用同一个对象。
为什么字符串不只是一个值类型呢?
当前回答
它不是一个值类型,因为如果它是一个值类型,并且它的值每次传递给方法或从方法返回时都必须复制,那么性能(空间和时间!)会很糟糕。
它有价值语义来保持世界的理智。你能想象编码有多困难吗
string s = "hello";
string t = "hello";
bool b = (s == t);
设b为假?想象一下编写任何应用程序是多么困难。
其他回答
实际上,字符串与值类型几乎没有相似之处。对于初学者来说,并不是所有的值类型都是不可变的,你可以随心所欲地改变Int32的值,而它在堆栈上的地址仍然是相同的。
字符串是不可变的有一个很好的理由,这与它是引用类型无关,但与内存管理有很大关系。当字符串大小发生变化时,创建一个新对象比在托管堆上移动对象更有效。我认为你把值/引用类型和不可变对象的概念混在一起了。
至于“==”:就像你说的,“==”是一个操作符重载,它的实现有一个很好的理由,使框架在处理字符串时更有用。
此外,字符串的实现方式(每个平台都不同)以及何时开始将它们拼接在一起。就像使用StringBuilder一样。它为你分配了一个缓冲区供你复制,一旦你到达终点,它会为你分配更多的内存,希望如果你做一个大的连接性能不会受到阻碍。
也许乔恩·斯基特可以过来帮忙?
这主要是性能问题。
在编写代码时,让字符串的行为像值类型一样有帮助,但如果它是值类型,则会对性能造成巨大影响。
要深入了解,请参阅一篇关于.net框架中字符串的好文章。
简单地说,任何具有一定大小的值都可以被视为值类型。
事实上,许多人提到的堆栈和内存是关于值类型和基本类型的,因为它们必须适合微处理器中的寄存器。如果它占用的比特数超过了一个寄存器....的比特数,那么您就不能向堆栈中插入或从堆栈中取出某个东西例如,这些指令是“pop eax”——因为eax在32位系统上是32位宽的。
浮点基元类型由80位宽的FPU处理。
这早在OOP语言混淆原始类型定义之前就已经确定了,我认为值类型是专门为OOP语言创建的术语。