字符串和垃圾收集

Kyl*_*ndo 16 .net c# string garbage-collection

我听过有关这个主题的相互矛盾的故事,我正在寻找一点清晰.

如何string立即处理物体,或至少清除它的痕迹?

Bri*_*sen 7

那要看.文字字符串被拘禁每默认,所以即使你的应用程序不再引用它,它不会被收集,因为它是由内部实习结构引用.其他字符串就像任何其他托管对象一样.一旦它们不再被您的应用程序引用,它们就有资格进行垃圾回收.

更多关于这个问题的实习:Java和.NET字符串文字在哪里?

  • @Kyle:只自动插入文字字符串.因此,如果你有`string s ="hello";`它将被实习,因为你在运行时创建的任何字符串都不会被实习,除非你自己这样做. (2认同)
  • 凯尔:没有.文字字符串是程序集的一部分,您的程序集永远不会被垃圾收集.但是你的程序集真的包含了很多字符串*文字*它们会导致内存压力吗?或者,如果这是关于安全性("清除跟踪"),请记住用户可以检查您的程序集,包括其文字字符串,而不执行它 - 实际上比检查在运行时构造的字符串更容易! (2认同)

小智 7

如果您需要保护字符串并且能够在需要时进行处理,请使用System.Security.SecureStringclass.

使用.NET 2.0的SecureString类保护敏感数据


小智 5

对于像这样的情况,我为字符串类编写了一个小扩展方法,它可能是确保字符串本身在收集之前不可读的唯一可靠方法.显然只适用于动态生成的字符串,而不是文字.

public unsafe static void Clear(this string s)
{
  fixed(char* ptr = s)
  {
    for(int i = 0; i < s.Length; i++)
    {
      ptr[i] = '\0';
    }
  }
}
Run Code Online (Sandbox Code Playgroud)