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