关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)
程序员文章站
2022-06-29 09:48:13
前言 昨天晚上闲着无事,就上csdn逛了一下,突然发现一个 "帖子" 很有意思,就点进去看了一下。 问题很精辟 int a = 1; object b=a; object c = b; c = 2; 为什么b不会变成2呢?b和c应该指向堆里面的同一个引用啊? 大神们的回答也让我深思,这里就把自己的理 ......
前言
昨天晚上闲着无事,就上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)