欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于“关于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查看结果:

关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

增加注释:

关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

我对于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# 编程指南)装箱部分内容关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

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

③测试过程中我发现当我改变b中对象值时,c不改变。我认为此时,当改变b对象后,已经在堆栈上新建对象,b指向此对象,而此时b,c不同。此处与class类型不同。关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

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