9

大家都知道.Net框架中String对象是直接存放在堆内存中的

我只是想了解 .Net 框架中是否有任何为字符串保留的内存。在 Java 中,有一个为字符串保留的内存,称为 SCMP(字符串常量内存池),其中字符串被初始化和垃圾收集,就像堆内存中的其他对象一样。

4

3 回答 3

6

我认为.Net 中没有类似的东西。

相反,我已经阅读了这个以及它有趣的字符串是如何使用的:

CLR 维护一个称为实习池的表,其中包含程序中的文字字符串。这可确保在您的代码中重复使用相同的常量字符串将使用相同的字符串引用。System.String 类提供了一个 Intern 方法,该方法确保字符串在实习池中并返回对它的引用。

另请查看此MSDN:-

我们已经看到了许多场景,其中托管堆包含重复数千次的相同字符串。结果是一个很大的工作集,其中大部分内存被字符串消耗。在这种情况下,最好使用字符串实习。

于 2013-09-16T15:32:43.680 回答
2

.Net 框架在表中保存字符串存储,Intern Pool. 你可能会看到:

字符串实习和 String.Empty - Eric Lippert

如果您在一个编译单元中有两个相同的字符串文字,那么我们生成的代码可确保 CLR 仅为程序集中该文字的所有实例创建一个字符串对象。这种优化称为“字符串实习”。

字符串实习 .Net 框架

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

于 2013-09-16T15:42:07.383 回答
1

在 .NET 中,文字字符串是“内部”的,因此每个文字字符串只有一个副本。

请参阅http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

于 2013-09-16T15:32:11.523 回答