一旦实例化了新字符串,"Objects (Diff)" 列(诊断工具)的值就不会更改

Value of "Objects (Diff)" column (Diagnostic Tools) is not changed once a new string has been instantiated

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

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

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

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

您没有看到差异,因为应用程序没有为这两个字符串分配内存。当您的代码中包含 string literals ("text in quotes is a string literal") 时,该字符串将嵌入您的程序集中(.exe 或 .dll,具体取决于项目类型)。加载应用程序时,您的程序集已完全加载到内存中,并且您的文字文本已经在内存中。当您将变量分配给此字符串文字时,您只是使变量指向该内存。
如果你想分配那么你必须生成一个新的字符串而不是使用字符串文字。 尝试使用 string constructor which repeats a letter:

创建一个字符串
    var str = new String('a', 20);

您应该会看到分配发生。

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