首页 > 解决方案 > 实例化新字符串后,“对象(差异)”列(诊断工具)的值不会更改

问题描述

实际上,这是我第一次对通过 Visual Studio 内置的诊断工具进行内存监控感兴趣。因此,也许我以错误的方式使用它。

我在调试以下代码时制作了 3 个内存快照:

在此处输入图像描述

  1. 断点位于第 7 行时的第一个 ID=1 快照;
  2. 断点在第 8 行时的第二个 ID=2 快照;
  3. 当断点位于 9 行代码时,最后第三个 ID=3 快照。

我的问题是为什么在str2分配新的字符串对象后,对象和堆大小的值没有改变——它们仍然是 168/57.80?我预计它们会增加。

标签: c#.netvisual-studiogarbage-collectionmemory-profiling

解决方案


您没有看到差异,因为应用程序没有为这两个字符串分配内存。当您的代码 ( ) 中有字符串文字"text in quotes is a string literal"时,该字符串将嵌入到您的程序集中(.exe 或 .dll 取决于项目类型)。加载应用程序时,您的程序集已完全加载到内存中,并且您的文字文本已经在内存中。当您将变量分配给此字符串文字时,您只是使变量指向该内存。
如果要分配,则必须生成一个新字符串,而不是使用字符串文字。尝试使用重复字母的字符串构造函数创建一个字符串:

    var str = new String('a', 20);

您应该会看到分配发生。

注意:请注意,编译器非常聪明,如果您尝试通过连接两个字符串文字 ( "this" + " is " + " a string") 来强制分配,编译器可能只会在编译期间生成一个新的字符串文字,并且将再次没有分配和运行时。


推荐阅读