书上说,装箱是把值类型转换成引用类型,那大家看下面的代码。
int a = 10;
object o = a;
Console.WriteLine (o.ToString());
object o1 = o;
o1 = 15;
Console.WriteLine (o1.ToString());
Console.WriteLine (o.ToString());            
其执行结果是:
10
15
10
这说明object也是通过值来进行传递的,如果是引用类型的话o最后的结果也应该和o1的值一样都是15,请问这是怎么回事啊?我试过class就可以都改变掉。但我想不通的是,class也是继承object的,请具体解释一下。谢谢!

解决方案 »

  1.   

    所有的引用對象都是繼承object,值對象繼承valuetype還是什麽的忘了。不過他的祖父還是object.
    什麽叫class繼承object不懂你哦。
    實話說這段代碼根本就沒演示出來裝箱和拆箱。建議看。net框架一書。
      

  2.   

    不是所有的自定义的class都是继承于object 么?
    class Myclass
    {
    }

    class Myclass :object
    {
    }
    不是一样么?
    上面不就是把一个整数包装成object类型么?为什么传的时候还是值传递?我就是看书看不懂才问的呀!晕!
      

  3.   

    object也是通过值来进行传递的??????????????传递引用吧....
      

  4.   

    object o1 = o;这个也许已经给O1赋了新、的引用地址
      

  5.   

    第一阶段
    o -> a
    第二阶段
    o1->o    o->a第三阶段
    o1->15   o->a
      

  6.   

    引用类型有点类似C++中的指针,o1 = o; 使o1和o指向同一片内存区域。
    o1=15使o1指向了另一片内存区,但o并没有改变。
      

  7.   

    你的这段代码其实没有体现出装箱。
    object 是所有类型的基类型,其实无论是引用类型或是值类型,都继承于object类型。
    如果你把object o = a; 中的object 换为其他自定义类型,一定会出错的
      

  8.   

    微软在Object的构造函数中是这样写的
     // Creates a new instance of an Object.
         public Object()
        {            
       }
    所以你创建的object对象每次都是一个新的引用

    object j=12;
    实际上等于
    int k=12;
    j=12;
    还是要发生一次装箱 .locals init ([0] object j)
      IL_0000:  ldc.i4.s   12
      IL_0002:  box        [mscorlib]System.Int32
      IL_0007:  stloc.0所以才会有你上面的现象
      

  9.   

    而且 你上面的代码用的是int a;
    int char double float struct 为简单类型
      

  10.   

    这个是对的
    第一个和第二个结果应该容易理解
    注意,代码中o1 = 15相当于
    object o2 = 15; //生成了一个新的对象(有装箱)
    o1 = o2;   //把新对象的引用赋给o1
    所以最后o没有变。
      

  11.   

    那这么说,每次用object 建立一个新引用的话就会产生一个新的引用?就像那个特殊的string一样?如果自己定义的类就会是真正的引用原来的对象。
    class Entry
    {
    static void Main(string[] args)
    {
                Temp a =new Temp();
                a.m_a = 100;
                Temp b = a;
                b.m_a  = 1000;
                Console.WriteLine(a.m_a.ToString());
    }
    }
    class Temp
    {
        public int m_a;
    }结果是1000,说明a,b指向同一个对象!
      

  12.   

    楼上的答非所问,字符串用等号赋值的时候是引用同一个对象,但如果修改其中一个引用的话不就是新建一个对象么?操作系统会讲字符串么?faint!
      

  13.   

    上面胡说八道的还理直气壮,真是……int a = 10;
    object o = a;//装箱
    Console.WriteLine (o.ToString());
    object o1 = o;//引用传递,其实到这一步都没错。
    o1 = 15;//错在这里!这里有装箱!
    Console.WriteLine (o1.ToString());
    Console.WriteLine (o.ToString());     o1 = 15;实际上和下面的代码是一样的
    int b = 15;
    o1 = b;明白了吗,o = a = 10,o1 = b = 15。
    如果你要测试值类型的装箱,你需要自己写一个可以修改成员变量的值类型出来:
    struct StructA
    {
      public StructA( int i )
      { this.i = i; } 
      public int i;
    }
      

  14.   

    还有,必须用接口来修改值。因为将object转换成值类型的拆箱操作中,值类型又被拷贝了一次。