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

本文关键字:位置 改变 字符串 引用 为什么 | 更新日期: 2023-09-27 18:03:02

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

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

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

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

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

一个特定的字符串将获得一个引用,该引用可在任何使用该字符串的地方重用。更改引用的值也会更改所有其他位置,这几乎不是您想要的…

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

垃圾收集

查看完整解释的链接,但这里是关于移动引用的详细信息:

"当垃圾回收被触发时,垃圾回收器会回收被死对象占用的内存。回收进程压缩活动对象,以便它们一起移动,并删除死空间,从而使堆更小。这确保了一起分配的对象在托管堆上保持在一起,以保持它们的局部性。"