前言

昨天晚上闲着无事,就上csdn逛了一下,突然发现一个帖子很有意思,就点进去看了一下。

问题很精辟

int a = 1;

object b=a;

object c = b;

c = 2;

为什么b不会变成2呢?b和c应该指向堆里面的同一个引用啊?

大神们的回答也让我深思,这里就把自己的理解写出来,如果有误,还请告知。

本文测试代码:

static void Main()
{
int a = 1;
object b = a;
object c = b;
c = 2;
}

使用ildasm.exe查看结果:

增加注释:

我对于IL代码的自己理解思路:

1、Idc.i4.1、 stloc.0  ==>  int a = 1;

2、Idloc.0、 box[mscorlib]System.Int32、 stloc.1  ==>  object b = a;(b指向在堆栈上新建对象值为1,与a无任何联系)

3、Idloc.1、 stloc.2  ==>  object c = b;

4、Idc.i4.2、 box[mscorlib]System.Int32、 stloc.2  ==>  c = 2;(c指向堆栈上新建对象值为2)

①对于2、4 可参考装箱和取消装箱(C# 编程指南)装箱部分内容

②对于3处,我理解是:b、c指向堆栈上同一个对象,帖子中12楼impasse这位仁兄回答也证实了这一点。

③测试过程中我发现当我改变b中对象值时,c不改变。我认为此时,当改变b对象后,已经在堆栈上新建对象,b指向此对象,而此时b,c不同。此处与class类型不同。

本文参考:IL指令详细大內高手專欄:.NET中間語言(IL)

最新文章

  1. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
  2. 非对称加密RSA的应用及在C#中的实现
  3. 用dedecms自定义表单创建简易自助预约系统
  4. PHP发送邮件。
  5. duilib corner属性的贴图技巧——让图片自动贴到控件的的某一边或者一角并自适应控件的大小
  6. Oracle- 数据库的备份
  7. MongoDB启动配置等
  8. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)
  9. docker对cpu使用及在kubernetes中的应用
  10. jquery中append与appendTo方法区别
  11. MySql优化子查询
  12. TortoiseSVN设置忽略文件和目录文件夹
  13. 火狐兼容window.event.returnValue=false;
  14. Sed工作原理
  15. Appium学习——安装Android SDK
  16. HTML:Registry design.(Include a simple web design use HTML)
  17. n&&m and n||m 的区别
  18. vmware esxi 过期,激活
  19. 20155316 实验一《Java开发环境的熟悉》实验报告
  20. HEVC代码记录(删除)

热门文章

  1. sqlmap 注入的方法及技巧
  2. django使用xadmin
  3. xSS-Reflected
  4. window-Mysql下载安装
  5. zz开源 MNN:淘宝在移动 AI 上的实践
  6. 7.Vue的计算属性
  7. Umi + Dva的数据传递学习Demo(代码有详细注释)
  8. 「总结」插头$dp$
  9. 测开面试 | Python语言常见问题
  10. 日常笔记5C/C++快速入门一些基础细节