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

本文关键字:一个 字符串 实习生 创建 是否 程序集 NET | 更新日期: 2023-09-27 18:27:44

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

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

字符串的内部表是CLR范围的:

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

因此,实习生表不仅不是特定于程序集的,而且它可以比您的程序集更持久。好消息是,重复的字符串不会成为问题,因为相同的文本字符串一旦被插入就存在于相同的引用中。因此建议使用Intern ing:

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

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.