在语言设计中,引用类型和值类型之间的区别基本上是一种性能权衡。引用类型在构造、销毁和垃圾收集方面有一些开销,因为它们是在堆上创建的。另一方面,值类型在方法调用上有开销(如果数据大小大于指针),因为整个对象被复制,而不仅仅是指针。因为字符串可以(而且通常是)比指针的大小大得多,所以它们被设计为引用类型。此外,正如Servy所指出的,值类型的大小必须在编译时知道,而字符串的情况并不总是这样。
易变性问题是一个单独的问题。引用类型和值类型都可以是可变的或不可变的。但是,值类型通常是不可变的,因为可变值类型的语义可能会混淆。
引用类型通常是可变的,但如果有意义,则可以设计为不可变。字符串被定义为不可变,因为它使某些优化成为可能。例如,如果同一个字符串文本在同一个程序中多次发生(这是非常常见的),编译器可以重用同一个对象。
那么,为什么要重载“=”来按文本比较字符串呢?因为它是最有用的语义。如果两个字符串在文本上相等,则由于优化,它们可能是也可能不是相同的对象引用。因此,比较参考文献是非常无用的,而比较文本几乎总是你想要的。
更广泛地说,Strings有所谓的价值语义..这是一个比值类型更普遍的概念,它是一个特定于C的实现细节。值类型具有值语义,但引用类型也可能具有值语义。当类型具有值语义时,您无法真正判断底层实现是引用类型还是值类型,因此可以考虑实现细节。