关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)...
2020-04-02 18:51
826 查看
前言
昨天晚上闲着无事,就上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)
转载于:https://www.cnblogs.com/njit-77/p/11468929.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 关于“关于C#装箱的疑问”帖子的个人看法
- 关于C#与C/C++的个人看法
- 关于个人针对CSDN的使用看法
- 对李洪根在csdn的blog上的一篇关于数据库安装的一点个人看法。
- c#中关于gethashcode()的一点看法
- 关于C# webform 项目发布 aspx页面无任何代码 每个页面都以dll形式发布
- 怎么在csdn中找到自己发布的帖子
- 怎么看待移动互联网时代 关于移动互联网时代的一点个人看法总结 在强烈的产业变化时期,主流观点是不靠谱的 什么是浪潮呢? 小型化、无线化、智能化。
- lucio博客-个人CSDN博客App客户端发布
- 个人关于数据结构的看法
- 谈谈个人关于程序开发中,“零配置”和“有配置”的看法
- 本学期的关于C语言的课已经正式结束 一些个人关于C语言学习的看法
- 关于Qt使用windeployqt发布相关问题解决办法--个人整理
- 关于Oracle 游标返回值 在C#中的运用(引用自www.souzz.net,个人学习参考用)
- 关于"是否需要有代码规范"的个人看法
- 关于UML的个人见解--转自http://blog.csdn.net/ccat/archive/2010/06/13/5668593.aspx
- C#中关于静态与非静态的一个疑问
- 怎么在csdn中找到自己发布的帖子
- 关于VJ 的个人看法