【发布时间】:2017-07-25 20:10:14
【问题描述】:
众所周知,在某些特定情况下,当在 C# 中使用字符串时,CLR 会将字符串实习作为优化。
所以我的问题是:
- 是否可以读取当前在实习生池中的所有字符串?
- 有没有办法获得对每个实习字符串的引用计数?
- 是否可以从单独的进程空间读取实习池?
- 如果这些都不可能,那么不允许这些用例的原因是什么?
在某些情况下监控内存使用情况时,我可以看到这有点有用。在处理敏感信息时它也可能很有用(尽管我认为SecureString 在许多情况下会更可取)。
据我所知,与字符串实习相关的唯一公共方法是 String.Intern(string) 和 String.IsInterned(string)
我是出于好奇而不是试图解决真正的问题。我意识到基于字符串实习生池执行任何逻辑都是一个坏主意。
【问题讨论】:
-
“不允许这些用例的原因是什么?” 因为every feature starts with -100 points 和团队正在做真正有用的事情。
-
"f 这些都不可能,不允许这些用例的原因是什么?"这些不是用例——它们是 API 功能请求没有用例。一个用例会解释为什么你想要做这些事情。你后来说你没有试图解决一个真正的问题这一事实表明你没有有一个用例。就个人而言,我不赞成将无用的功能混杂在一起。
-
可能。通过 Microsoft.Diagnostics.Runtime 中的 ClrMD API 获取所有对象的列表,并使用 IsInterned 查找所有已插入字符串。 API 还可能提供您需要的其他统计信息。除非您正在编写调试器,否则没有理由这样做。