关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)
2024-08-28 09:17:19
前言
昨天晚上闲着无事,就上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)
最新文章
- .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
- 非对称加密RSA的应用及在C#中的实现
- 用dedecms自定义表单创建简易自助预约系统
- PHP发送邮件。
- duilib corner属性的贴图技巧——让图片自动贴到控件的的某一边或者一角并自适应控件的大小
- Oracle- 数据库的备份
- MongoDB启动配置等
- Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)
- docker对cpu使用及在kubernetes中的应用
- jquery中append与appendTo方法区别
- MySql优化子查询
- TortoiseSVN设置忽略文件和目录文件夹
- 火狐兼容window.event.returnValue=false;
- Sed工作原理
- Appium学习——安装Android SDK
- HTML:Registry design.(Include a simple web design use HTML)
- n&&m and n||m 的区别
- vmware esxi 过期,激活
- 20155316 实验一《Java开发环境的熟悉》实验报告
- HEVC代码记录(删除)