zoukankan      html  css  js  c++  java
  • 关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

    前言

    昨天晚上闲着无事,就上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)

  • 相关阅读:
    oracle插入数据
    保存图片
    ASCII码排序及md5加密
    JavaScript
    HTML
    py访问Redis和zk操作
    Zookeeper集群搭建以及python操作zk
    并发编程
    Python之socket(套接字)
    Python 网络编程
  • 原文地址:https://www.cnblogs.com/njit-77/p/11468929.html
Copyright © 2011-2022 走看看