//=================================
object o1, o2;
int i=100;
o1=i;   // 装箱,转换成引用类型
o2=o1;  // 将o1的值赋给o2
i=200;  // 修改变量i的值
Console.WriteLine(object.ReferenceEquals(o1,o2));//true
o1=i;   // 重新装箱
Console.WriteLine(object.ReferenceEquals(o1,o2));//false
Console.Write(o2);  // 将o2的值输出
//=================================

解决方案 »

  1.   

    o1=i;   // 重新装箱
    这行code,导致了o1的引用发生变化
      

  2.   

    object o1,o2,o3;
    int i = 1000;
    o1 = i;
    o2 = i;
    o3 = i;
    Console.WriteLine(object.ReferenceEquals(o1,o2));
    Console.WriteLine(object.ReferenceEquals(o1,o3));
    Console.WriteLine(object.ReferenceEquals(o2,o3));这个上面的结果全部是false;
    只要发生一次装相操作,都会返回一个新的引用,跟上次的装箱操作没有关系
      

  3.   

    Int32和string一样,都是只读的引用类型。
      

  4.   

    Int32和string一样,都是只读的引用类型。
    >>>Int32是引用类型?
      

  5.   

    http://blog.csdn.net/brightheroes/archive/2004/12/20/222856.aspx
    关于string类型
      

  6.   

    System.Object
       System.ValueType
          System.Int32上述中的Int32特指int被装箱后的System.Int32结构。因为int是不可能作为结构存在内存中的吧。
      

  7.   

    数据类型分隔为值类型和引用类型。值类型要么是堆栈分配的,要么是在结构中以内联方式分配的。引用类型是堆分配的。引用类型和值类型都是从最终的基类 Object 派生出来的。当值类型需要充当对象时,就在堆上分配一个包装(该包装能使值类型看上去像引用对象一样),并且将该值类型的值复制给它。该包装被加上标记,以便系统知道它包含一个值类型。这个进程称为装箱,其反向进程称为取消装箱。装箱和取消装箱能够使任何类型像对象一样进行处理。
      

  8.   

    呵呵,不一定只有结构才是值类型啊,int decimal等都是值类型的:)
      

  9.   

    to  Ivony() Int32和int是同一个东西,.net里的装箱和java不同,没有wrapper class。int只不过是C#的一个关键字用来指Int32,你去看生成的IL就能明白这一点。楼主的这个问题最好把《.net框架程序设计》这本书找来,好好读一下关于装箱的部分,就能明白了。关键在于每次装箱,都会产生一个新的对象。你可以试下这个代码:class Test
    {
       public int i;
       public override string ToString()
       {
           return i.ToString();
        }
    }Test t = new Test();
    t.i = 100;
    Object o1 = t;
    Object o2 = o1;
    Test t2 = (Test)o1;
    t2.i = 200;Console.Writeline(o2);object o1 = t
      

  10.   

    只要发生一次装相操作,都会在托管堆中分配一个新的内存地址
    分析如下:
    //=================================
    object o1, o2;
    int i=100;
    o1=i; // 装箱,转换成引用类型,
    o2=o1; // 将o1的值赋给o2,o1和o2指向同一块内存,这里假设内存为k1
    i=200; // 修改变量i的值
    o1=i; // 重新装箱,分配新的内存k2,这里o1指向k2,而o2还是指向k1.
    Console.Write(o2); // 将o2的值输出所以结果不同.