众所周知,在某些情况下,当在C#中使用字符串时,CLR会将字符串interning作为优化来使用。是否有可能读取实习生池中的所有字符串?
所以我的问题是:
- 它可以读取当前所有的实习生池的字符串?
- 有没有办法让每个interned字符串的引用计数?
- 是否可以从单独的进程空间读取实习生池?
- 如果这些都不可能,那么不允许这些用例的原因是什么?
在某些情况下,我可以看到这在监视内存使用情况时有点用处。在处理敏感信息时也可能有用(尽管在许多情况下,我认为SecureString
会更可取)。
据我所知,相关的字符串实习唯一的公共方法String.Intern(string)
和String.IsInterned(string)
我问出于好奇,而不是试图解决一个真正的问题。我意识到,根据字符串实习生池做任何逻辑将是一个坏主意。
_“不允许使用这些用例的原因是什么?”因为[每个功能都以-100分开始](https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus- 100分/),而团队则是在做一些实际有用的事情。 – stuartd
“f这些都不可能,不允许这些用例的原因是什么?”这些不是用例 - 它们是API功能请求*,没有用例。一个用例可以解释为什么*你想要做这些事情。事后你说你不是在试图解决一个真正的问题,这表明你没有*用例。就我个人而言,我并不赞成混淆无用的功能。 –
可能。通过* Microsoft.Diagnostics.Runtime *中的ClrMD API获取所有对象的列表,并使用* IsInterned *查找所有实例化的字符串。该API还可以提供您需要的其他统计信息。没有理由这样做,除非你正在编写一个调试器。 – IllidanS4