为什么字符串引用本身的位置会发生变化?

时间:2011-07-19 19:54:30

标签: c# .net

string[] names = {"avinash","harish", "savan", "shyam" };
foreach (var name in names)
    namesAll += name;

我们知道字符串在.NET中是不可变的。每次我们将新字符串连接到现有字符串时,都会保留一个新的内存位置,其中包含新的连接字符串...字符串引用指向该字符串。这对我来说似乎很好。

让我感到困惑的是为什么字符串引用(namesAll)的位置也会发生变化?对我来说,这似乎完全没必要。您可以使用Memory窗口在Visual Studio中确定这一点,以查看字符串引用的位置(namesAll)。

这是每次迭代后namesAll的地址:0x01ef9594 0x01ef961c 0x01ef9644请注意,这不是连接字符串的地址(显然会改变),但字符串的地址引用namesAll。

2 个答案:

答案 0 :(得分:7)

特定字符串将获得在使用字符串的任何位置重用的引用。更改引用的值也会改变所有这些其他位置,几乎不是您想要的......

当在每次迭代中创建一个新字符串时,一个新字符串会获得一个新的内存位置 - 这由变量引用,因此是新地址。

答案 1 :(得分:0)

Garbage Collection

请参阅链接以获取完整说明,但以下是有关移动参考的详细信息:

“当触发垃圾收集时,垃圾收集器回收死对象占用的内存。回收过程压缩活动对象以便它们一起移动,并删除死区从而使堆更小。这可以确保分配在一起的对象在托管堆上保持在一起,以保留它们的位置。“