如何防止字符串被拦截

Pet*_*etr 11 c# memory

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

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

Mat*_*son 6

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

否则,如果在任何地方都没有对该字符串的引用,则GC仍将对其进行清理(它将不再进行内部检查),因此您无需担心内部检查。

当然,只有字符串文字会首先插入(或者,如果您调用Petr和其他人在上面提到的String.Intern())。

  • @downvoter:您能解释一下为什么只是为了帮助阅读此答案的其他人吗? (5认同)

ill*_*ant 5

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

[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
Run Code Online (Sandbox Code Playgroud)

有关CompilationRelaxations的更多信息

更新:

文档说明了属性:

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

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

这个关于该属性的SO问题

  • 将程序集标记为**不需要**字符串文字实习与说该功能应该关闭的不同http://social.msdn.microsoft.com/Forums/en-US/clr/thread/ c1c1d969-8d6b-4aaf-b7f4-3febedf3cd18 / (2认同)