c# - 实例化新字符串后,“对象(差异)”列(诊断工具)的值不会更改
问题描述
实际上,这是我第一次对通过 Visual Studio 内置的诊断工具进行内存监控感兴趣。因此,也许我以错误的方式使用它。
我在调试以下代码时制作了 3 个内存快照:
- 断点位于第 7 行时的第一个 ID=1 快照;
- 断点在第 8 行时的第二个 ID=2 快照;
- 当断点位于 9 行代码时,最后第三个 ID=3 快照。
我的问题是为什么在str2
分配新的字符串对象后,对象和堆大小的值没有改变——它们仍然是 168/57.80?我预计它们会增加。
解决方案
您没有看到差异,因为应用程序没有为这两个字符串分配内存。当您的代码 ( ) 中有字符串文字"text in quotes is a string literal"
时,该字符串将嵌入到您的程序集中(.exe 或 .dll 取决于项目类型)。加载应用程序时,您的程序集已完全加载到内存中,并且您的文字文本已经在内存中。当您将变量分配给此字符串文字时,您只是使变量指向该内存。
如果要分配,则必须生成一个新字符串,而不是使用字符串文字。尝试使用重复字母的字符串构造函数创建一个字符串:
var str = new String('a', 20);
您应该会看到分配发生。
注意:请注意,编译器非常聪明,如果您尝试通过连接两个字符串文字 ( "this" + " is " + " a string"
) 来强制分配,编译器可能只会在编译期间生成一个新的字符串文字,并且将再次没有分配和运行时。
推荐阅读
- ios - 按日期分组时,显示错误的日期
- webpack - 在我的文件中使用 Bootstrap 4 变量
- python - Python:AttributeError:当我传递用户定义的对象时,'int'对象没有属性错误
- php - PHP随机加减10到一个变量
- php - SocialEngine 如何选择表格
- python - 在python中对每一行进行编号
- c# - Unity:使用 Resources.LoadAll 加载包含音频文件的子文件夹
- wordpress - Wordpress 简码显示问题
- php - 致命错误:在第 31 行的 C:\wamp\www\p3\controller\backend.php 中的非对象上调用成员函数 getid()
- c - 将字符串元素复制到另一个字符串时出现分段错误