【问题标题】:Does .NET create a string intern pool for each assembly?.NET 是否为每个程序集创建一个字符串实习生池?
【发布时间】:2014-12-20 02:30:23
【问题描述】:

我有一种情况,我会遇到大量重复的字符串,这些字符串会在内存中持续很长时间。我想使用String.Intern,但我不想侵入任何潜在的应用程序资源,因为我的项目是一个库。这是如何工作的?

【问题讨论】:

  • 嗯,内部字符串是引用计数的。包含引用的主要对象是 AppDomain 拥有的表(类似于 HashSet)。卸载 appdomain 会清空表,减少引用计数。绝大多数(如果不是全部)字符串应该消失。没有“入侵”危险。
  • 有点跑题了,但是在搜索有关字符串实习的各种信息时,我发现了这篇非常有趣的博客文章:blog.benoitblanchon.fr/modify-intern-pool。另请参阅相关的源代码。

标签: c# .net string-interning


【解决方案1】:

字符串的实习生表是CLR-scoped:

首先,分配给实习字符串对象的内存不太可能 直到公共语言运行时 (CLR) 终止。这 原因是 CLR 对实习字符串对象的引用可以 在您的应用程序甚至您的应用程序域之后持续存在, 终止。

因此,实习生表不仅不是特定于程序集的,而且它可以比您的程序集更长寿。好消息是重复的字符串不会成为问题,因为相同的文字字符串一旦被实习就存在相同的引用。所以推荐Interning:

公共语言运行时通过维护一个 表,称为实习生池,其中包含对 以编程方式声明或创建的每个唯一文字字符串 你的程序。因此,文本字符串的实例具有 特定值在系统中只存在一次。

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2019-09-23
    • 2012-11-14
    • 2013-07-14
    相关资源
    最近更新 更多