.net字符串缓存/池

时间:2010-08-26 16:33:30

标签: c#

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

2 个答案:

答案 0 :(得分:6)

字符串文字被实习,如果这就是你所说的:

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返回的字符串对象),答案是否定的,默认情况下它们不会被缓存。但是,如果你绝对必须,你可以创建自己的缓存或实习它们。由于许多字符串都是短命的,我怀疑在大多数情况下它不值得缓存。

答案 1 :(得分:5)

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

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

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

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