.net字符串缓存/池

.net sting类是否支持缓存/池机制来减少分配开销?

字符串文字被实习,如果你正在谈论的话:

string x = "hello"; string y = "hel" + "lo"; string z = "h" + "ello"; bool a = object.ReferenceEquals(x, y); bool b = object.ReferenceEquals(y, z); 

ab都保证是真的。

您也可以自己调用string.Intern

但是,就普通字符串而言(例如, string.Format返回的字符串对象),答案是否定的,默认情况下它们不会被缓存。 但是,如果你绝对必须,你可以创建自己的缓存或实习它们。 由于许多字符串都是短命的,我怀疑在大多数情况下它不值得缓存。

.NET不会为你做这件事,但我们编写了一个直接用于帮助实现这一目标的类,该类发布在codeproject.com上的一篇文章中 (包括我们的单实例字符串存储的实现)。 我们在直布罗陀内部使用它来减少内存影响,特别是在Gibraltar.Agent库中,该库旨在安全地包含在客户的生产应用程序中。

该类允许您合并对字符串的任何引用,以便每个唯一字符串值在已合并的所有引用中共享相同的副本,但它仍然允许在删除对它的所有引用时自动对该副本进行垃圾回收。 可以定期打包每个WeakReference和查找表的小开销。

这对我们的情况非常有效,特别是因为Gibraltar.Agent将处理大量的各种字符串作为度量和记录数据,其中一些可能会长时间存在并需要很多引用,而其他可能是只使用一次,再也不需要了。 当您经常重新计算相同的有效字符串值时,这是特别有用的,因为相同值的运行时生成将始终以新引用结束,但字符串存储可用于立即将该值替换为该值的“官方”副本。

它在某些应用程序中可能没那么有用,例如,如果大多数字符串都在可替换的可访问或实际的引用中,例如在DataSet中。