我的理解(可能是错误的)是在c#中创建一个字符串时,它会被插入“实习池”。这样可以保持对字符串的引用,以便多个相同的字符串可以共享操作内存。
但是我正在处理很多很可能是唯一的字符串,我需要在完成每个字符串之后将它们从操作内存中完全删除,我不确定如何删除缓存的引用垃圾收集器可以从内存中删除所有字符串数据。如何防止字符串在此缓存中被中断,或者如何清除它/从中删除字符串以便它确实从操作内存中删除?
答案 0 :(得分:5)
将CompilationRelaxations
属性应用于整个程序集(看起来唯一可行的解决方案是禁止在程序集级别上实习),如下所示:
[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
的更多信息
<强>更新强>
文档说明属性:
将程序集标记为不需要字符串文字实习。
换句话说,它不会阻止编译器执行字符串 实习,只是提供一个不需要的提示。该 文档在这个领域有点稀疏,但这似乎也是如此 在 this MSDN forum post 中得出结论。
来自该属性的this SO question
答案 1 :(得分:4)
出于安全原因,如果您需要从内存中删除字符串,请使用SecureString
。
否则,如果在任何地方都没有对该字符串的引用,GC将会清理它(它将不再被实习),因此您不必担心实习。
当然,只有字符串文字才会被置于第一位(或者如果你像Petr和其他人所说的那样调用String.Intern())。
答案 2 :(得分:1)
在尝试阻止实习之前,我建议使用String.IsInterned()来确定您所关注的字符串是否实际上是实际的。如果该函数返回null,则不会中断您的字符串。
据我所知,在运行时动态生成的字符串根本没有实现,因为没有性能优势。
答案 3 :(得分:1)
你说的是:
默认情况下,运行时值不会被实现。您从文件中收到一个字符串或自己创建一个字符串,它们都有一个单独的实例。你可以通过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删除。