对装箱有一定的理解,它是把值类型隐式的转换成引用类型。
大家看下面的两段代码:
class Program
    {
        static void Main(string[] args)
        {
            int i = 9;
            f(i,i);//此处应该有两次装箱吧?
        }
        public static void f(object o1, object o2)
        {
            if (o1 == o2)
                System.Console.WriteLine("Same reference");
            else
                System.Console.WriteLine("Different reference");
        }
     }
结果:Difference reference
class Program
    {
        static void Main(string[] args)
        {
            int i = 9;
            object o = i;//此处装箱
            f(o,o);
        }
        public static void f(object o1, object o2)
        {
            if (o1 == o2)
                System.Console.WriteLine("Same reference");
            else
                System.Console.WriteLine("Different reference");
        }
     }
结果:Same reference
我的问题是:o1==o2,比较的是什么呢?值和类型?
为什么两段代码执行的结果不一样呢?
望高手详解。

解决方案 »

  1.   

    o1==o2比较的是 i 的内存地址,因为o1,o2存放的都是i的内存地址,所以Same reference
      

  2.   

    第一个在调用方法时相当于object o1=9; object o2=9;实际上内存中有两个9 o1和o2引用着不同的9,所以o1!=o2
    第二个在调用方法时相当于object o1=o; object o2=o o里面是i的内存地址所以o1==o2
    o1==o2比较的是o1,o2的值前面3帖不好意思
      

  3.   

    o1==o2始终比较的是o1,o2的值!
      

  4.   

    o1,o2的值是内存地址,第一个里面o1,o2存着不同的9的地址,第二个里面o1,o2存的是o的值,o的值就是内存地址,就是i的地址
      

  5.   

    我觉得就是f(o,o)传的是一个对象所以比较的时候比较的是他们所装的内容!及o1,o2是指向同一个对象的
    第二种在函数中去装箱,他们会指向同一个数据,但是是两个不同的对象,所以地址不同
      

  6.   

    o1==o2,比较的是两个object的引用是不是指向内存中的同一地址第一个例子中,发生了2次装箱操作,在托管堆上存放了2个不同地址的对象,
    o1与o2分别指向托管堆的2个不同地址,所以o1==o2的结果为false第一个例子中,只发生了一次装箱操作,在托管堆上只存放了1对象
    o1与o2指向的是托管堆中的同一地址,所以o1==o2的结果为true
      

  7.   


    第三段有错误:
    个例子中,只发生了一次装箱操作,在托管堆上只存放了1对象 
    o1与o2指向的是托管堆中的同一地址,所以o1==o2的结果为true
      

  8.   

    o1 == o2比较的是地址  第一段程序 两次装箱 在堆中形成两个实体 在栈中o1和o2分别指向两个实体   第二段程序中 装了一次箱 然后把这个地址两次当作参数 使用  实际上在堆中就创建了一个实体  在栈中 o1 和o2 都是复制的o中的地址  所以o1 == o2是一样的   要想比较指向的内容用 o1.Equals(o2)   如果用Equals  第一段程序 就是“Same reference”
      

  9.   

    后面一个 object o = i;//此处装箱
    这个地方装箱一次,只有一个对象.地址和值都相同.