【发布时间】:2011-09-08 08:35:10
【问题描述】:
几周前,我发现 C# 中的字符串被定义为引用类型而不是值类型。最初我对此感到困惑,但经过一番阅读,我突然明白为什么将字符串存储在堆上而不是堆栈上很重要——因为将一个非常大的字符串复制到一个不可预测的数字上会非常低效堆栈帧。我完全接受。
我觉得我的理解差不多完成了,但是我缺少一个元素——字符串使用什么语言特性来保持它们不可变?用一个代码示例来说明:
string valueA = "FirstValue";
string valueB = valueA;
valueA = "AnotherValue";
Assert.AreEqual("FirstValue", valueB); // Passes
当我将 valueA 分配给 valueB 时,我不明白什么语言功能会复制它。或者,当我将 valueA 分配给 valueB 时,对 valueA 的引用并没有改变,当我设置字符串时,只有 valueA 获得了对自身的新引用。由于这是一个实例类型,我不明白为什么会这样。
我知道您可以重载,例如 == 和 != 运算符,但我似乎找不到任何有关重载 = 运算符的文档。有什么解释?
【问题讨论】:
-
当然你说的是语言特性,但这里的不变性不是正确的术语(正如 Jason 所说,它只是关于类)。在 C# 中,分配是通过复制引用而不是分配引用本身来完成的。也许你也应该看到这个:c-sharp-reference-assignment-operator
-
我喜欢把它读成这样,
string valueA = new String("FirstValue");string valueB = valueA;valueA = new String("AnotherValue");
标签: c# string reference heap-memory