12

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

4

1 回答 1

13

字符串的实习生表是CLR 范围的

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

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

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

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.
于 2014-10-24T09:05:08.317 回答