Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net字符串缓存/池_C# - Fatal编程技术网

C# .net字符串缓存/池

C# .net字符串缓存/池,c#,C#,.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); a和b都保证为真 你也可以叫你自己 但是,对于普通字符串(例如,string.Format返回的字符

.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);
a
b
都保证为真

你也可以叫你自己


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

.NET不适合您,但我们编写了一个简单的类来帮助您实现这一点,该类发布在中(包括我们的单实例字符串存储的实现)。我们自己在内部使用它来减少内存影响,特别是在Gibraltar.Agent库中,该库设计用于安全地包含在客户的生产应用程序中

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

这在我们的案例中非常有效,特别是因为Gibraltar.Agent将处理大量作为度量和日志数据通过它的各种字符串,其中一些字符串可能会停留很长时间,需要很多引用,而另一些可能只使用一次,不再需要。当您经常重新计算相同的有效字符串值时,这尤其有用,因为相同值的运行时生成总是以新引用结束,但字符串存储可以用于立即用该值的“正式”副本替换该引用


在某些应用程序中,它可能没有那么有用,例如,如果您的大多数字符串都在引用中,而这些引用又无法访问或替换,例如在数据集中。

@Jon Skeet:我说的是普通字符串。例如:字符串返回的字符串对象。Format@Maanu:则否,默认情况下不会缓存它们。但是你可以创建你自己的缓存,或者在必要时实习。由于许多字符串都是短期的,我怀疑在大多数情况下它不值得缓存。string.Intern的缺点是它是永久的,因此它会在AppDomain的生命周期中保留一个字符串副本,即使您的代码没有进一步引用它。在某些情况下,这才是你真正想要的,这可能有点内存泄漏。@Rob:是的。通常,最好保留一个
哈希集
或类似的东西。@Jon Skeet:要允许正常的垃圾收集,您不能保留对字符串的引用。因此,不能通过字符串本身为查找设置键(也不能通过WeakReference为哈希表设置键,因为这在任何时候都可能变得毫无价值)。请参阅我的答案中有关codeproject的文章,了解我们是如何解决这些问题的。如果您使问题标题更清晰,并添加一些其他适用的标记,那么如果其他人有相同的基本问题(这可能意味着额外的投票),您可以通过搜索使其更易于发现。