2

在下面的代码段中,我有两个变量firstStringsecondString它们具有相同的值"Hello"。所以两个变量的引用位置是相同的。

var firstString = "Hello";
var secondString = "Hello";
bool isSameReference = Object.ReferenceEquals(firstString, secondString);
//same reference for both variables

但是将secondString值更新为“嘿”不会更新firstString,即使它指的是相同的位置。为什么这些引用相同参考位置的变量没有得到更新?

secondString = "Hey..";
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//reference changed but firstString not updated

将它的先前值更新secondString“Hello”使引用相同。

secondString = "Hello";
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//now the reference for both variables are same

为什么 c# 有这种行为以及 frmaework 如何在内部处理这个?提前致谢

4

3 回答 3

5

这个过程称为实习。您可以在此处阅读有关字符串实习的更多信息。在分配与现有内容完全相同的新 sting 时,这可以节省一些空间和处理时间。stings interning 也使得字符串比较简单的操作。这是可能的,因为String它是不可变类型。

于 2013-09-02T14:40:51.617 回答
1

你没有更新字符串,你更新了对字符串的引用,它现在指向“hey…”,它不包括对 firstString 的字符串“Hello”的引用。此外,c# 的“编译器”收集每个静态字符串在您的代码中没有双峰的列表中,这就是为什么如果您比较对它们的引用,不同地方的两个不同的“Hello”是相同的字符串的原因。

于 2013-09-02T14:46:17.763 回答
0

C# (.NET) 在 .NET 堆中只保存每个字符串文字一次。“Hello”和“Hey...”字符串存储在 .NET 堆上的两个不同位置。最初,firstString 和 secondString 都指向“Hello”位置。secondString = "嘿.."; 只需将 secondString 变量更改为指向“Hey...”所在的堆上的位置。您应该知道,字符串变量保存了堆中字符串实际所在位置的地址(引用)。

于 2013-09-02T14:44:26.067 回答