none
关于装箱的一个问题,请教 RRS feed

  • 问题

  • int i = 0;

    object obj = (object) i;     //装箱
    obj = ((int) i) + 3;     // 在堆上改变i的值
    i += 1;     // 在栈上改变i的值 

    Console.WriteLine(obj.ToString());
    Console.WriteLine(i.ToString());

    结果:3,1

    如果上面的解释是正确的话,那么下面obj1的值为什么不是3呢?

                int i = 0;
                object obj = (object)i;    
                object obj1 = obj;
                obj = ((int)i) + 3;
                Console.WriteLine(obj.ToString());
                Console.WriteLine(obj1.ToString());

    我的解释是,对于obj = ((int)i) + 3; 是3被拷到堆上(装箱)并将 obj 放到栈上,obj 的值是在堆上的新对象的内在地址(即指针),而不去指向堆上的i对象了,所以,最终obj的值为3,obj1的值为0

    也不知道对不对,很迷惑

    英文地址:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_boxing02122006144943PM/csharp_boxing.aspx

    中文地址:http://www.cnblogs.com/nihgwu/archive/2006/08/18/480318.html

     

    2011年6月24日 1:13

答案

  • 你好,

    我认为你的理解是对的。可能“在堆上改变i的值”这句话稍微有点误导性。

    我看了原文后觉得作者的本意就是“改变obj的值”,而obj是“堆上的i”.

    实际上改的并不是一个对象的值,而是把obj指向了另一个装箱后的对象。

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 jason-xiao 2011年6月28日 12:22
    2011年6月28日 6:37
    版主

全部回复

  • 第一段代码里面, New 了一个 object 来装 int, 所以值不相同。

     

    第二段代码里面,你在最后一行加上:

    Console.WriteLine(obj.Equals(obj1));
    

    你就知道为什么它们不等了。


    学习学习....
    2011年6月27日 8:32
  • 你好,

    我认为你的理解是对的。可能“在堆上改变i的值”这句话稍微有点误导性。

    我看了原文后觉得作者的本意就是“改变obj的值”,而obj是“堆上的i”.

    实际上改的并不是一个对象的值,而是把obj指向了另一个装箱后的对象。

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 jason-xiao 2011年6月28日 12:22
    2011年6月28日 6:37
    版主