我想知道.NET&#39的string.Remove()方法是如何对内存进行操作的。
如果我有以下代码:
string sample = "abc";
sample = sample.Remove(0);
记忆中会发生什么?
如果我理解正确,我们已经分配了一个由3个字符组成的字符串,然后我们在字符串的新副本上删除了所有字符串,将副本分配给旧引用,然后覆盖它,并且什么呢?这3个字符会发生什么变化?
如果我们不再指向他们,并且他们没有被释放(至少不是我意识到的),他们将作为垃圾留在内存中。
但是,我确信CLR有一些方法可以检测它并最终释放它们。
所以你们中的任何人都知道这里发生了什么?提前谢谢!
答案 0 :(得分:3)
首先Remove
将创建一个没有字符的新字符串(空字符串)。这将涉及为char数组分配一个string
对象来包装它。然后,您将该字符串的引用分配给您的本地变量。
由于字符串"abc"
是一个文字字符串,它仍然存在于实习池中,除非您已禁用编译时文字字符串的实际内容,因此不会对其进行垃圾回收。
总而言之,您创建了两个新对象,并将变量sample
的引用从旧对象更改为新对象。
答案 1 :(得分:1)
根据源代码:http://referencesource.microsoft.com/#mscorlib/system/string.cs
Remove()
分配一个新的字符串对象并将结果返回给您sample
变量将替换为不再具有第一个字符的新string
对象