.net字符串缓存/池

Maa*_*anu 4 c#

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

Jon*_*eet 6

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

string x = "hello";
string y = "hel" + "lo";
string z = "h" + "ello";

bool a = object.ReferenceEquals(x, y);
bool b = object.ReferenceEquals(y, z);
Run Code Online (Sandbox Code Playgroud)

双方ab保证是真的.

你也可以打电话给string.Intern自己.

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


Rob*_*ker 5

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

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

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

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