如何防止字符串被拦截

我的理解(可能是错误的)是在c#中创建一个字符串时它会被插入“实习池”。 这保持了对字符串的引用,以便多个相同的字符串可以共享操作内存。

但是我正在处理很多很可能是唯一的字符串,我需要在完成每个字符串之后将它们从操作内存中完全删除,我不知道如何删除缓存的引用以便垃圾收集器可以从内存中删除所有字符串数据。 如何防止字符串在此缓存中被中断,或者如何清除它/从中删除字符串以便它确实从操作内存中删除?

如果出于安全原因需要从内存中删除字符串,请使用SecureString

否则,如果在任何地方都没有对字符串的引用,GC无论如何都会清理它(它将不再被实习),因此您不必担心实习。

当然,只有字符串文字才会被置于第一位(或者如果你像Petr和其他人所说的那样调用String.Intern())。

CompilationRelaxations属性应用于整个程序集(看起来唯一可能的解决方案是禁止在程序集级别上实习),如下所示:

 [assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)] 

有关CompilationRelaxations的更多信息

更新:

文档说明属性:

将程序集标记为不需要字符串文字实习

换句话说,它不会阻止编译器进行字符串实习,只是提供一个不需要它的提示。 这方面的文档有点稀疏,但这似乎也是MSDN论坛post中的结论。

从这个关于该属性的SO问题

在尝试阻止实习之前,我建议使用String.IsInterned()来确定你所关注的字符串是否实际上是实际的。 如果该函数返回null,则不会中断您的字符串。

据我所知,在运行时动态生成的字符串根本没有实现,因为没有性能优势。

你说的是:

  • 您正在处理大量字符串,因此您正在讨论运行时值。
  • 您希望在完成处理后从内存中删除字符串。

默认情况下,运行时值不会被实现。 您从文件中收到一个字符串或自己创建一个字符串,它们都有一个单独的实例。 您可以通过String.Intern实习它们。 实习字符串需要更多时间,但占用的内存更少。 请参阅: http : //msdn.microsoft.com/en-us/library/system.string.intern.aspx

如果没有对它们的引用,GC会自动删除运行时字符串。 interned将有更多的引用,但在您的过程结束时,我假设所有引用都被删除。 实习机制不保留HARD参考,而是保持参考。 GC会忽略弱引用,因此仍可以删除字符串实例。 请参阅: http : //msdn.microsoft.com/en-us/library/system.weakreference.aspx

所以……总结一下。 默认情况下,您的运行时字符串不会被实现。 如果他们被实习,他们仍然会在你的工作完成后被GC删除。