.NET是否为每个程序集创建一个字符串实习池?

时间:2014-10-24 09:02:46

标签: c# .net string-interning

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

1 个答案:

答案 0 :(得分:12)

字符串的实习表是CLR-scoped

  

首先,不太可能为interned String对象分配内存   在公共语言运行库(CLR)终止之前一直被释放。该   原因是CLR对interned String对象的引用可以   在您的申请,甚至您的申请域之后坚持,   终止。

因此,不仅实习表不是特定于装配,而且它可以比装配更长。好消息是重复的字符串不会成为问题,因为相同的文字字符串一旦被实现就存在相同的引用。因此建议使用Intern

  

公共语言运行库通过维护a来保存字符串存储   表,称为实习池,包含单个引用   以编程方式声明或创建的每个唯一文字字符串   你的计划。因此,带有一个文字字符串的实例   特殊值仅在系统中存在一次。

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.