String.Remove()如何操作内存?

时间:2016-03-14 20:06:10

标签: c# string security memory

我想知道.NET&#39的string.Remove()方法是如何对内存进行操作的。

如果我有以下代码:

string sample = "abc";
sample = sample.Remove(0);

记忆中会发生什么?

如果我理解正确,我们已经分配了一个由3个字符组成的字符串,然后我们在字符串的新副本上删除了所有字符串,将副本分配给旧引用,然后覆盖它,并且什么呢?这3个字符会发生什么变化?
如果我们不再指向他们,并且他们没有被释放(至少不是我意识到的),他们将作为垃圾留在内存中。 但是,我确信CLR有一些方法可以检测它并最终释放它们。

所以你们中的任何人都知道这里发生了什么?提前谢谢!

2 个答案:

答案 0 :(得分:3)

首先Remove将创建一个没有字符的新字符串(空字符串)。这将涉及为char数组分配一个string对象来包装它。然后,您将该字符串的引用分配给您的本地变量。

由于字符串"abc"是一个文字字符串,它仍然存在于实习池中,除非您已禁用编译时文字字符串的实际内容,因此不会对其进行垃圾回收。

总而言之,您创建了两个新对象,并将变量sample的引用从旧对象更改为新对象。

答案 1 :(得分:1)

根据源代码:http://referencesource.microsoft.com/#mscorlib/system/string.cs

  • 方法Remove()分配一个新的字符串对象并将结果返回给您
  • 在您的代码示例中,sample变量将替换为不再具有第一个字符的新string对象
  • 当垃圾收集器触发时,将收回孤立的字符串。