日期:2014-05-18  浏览次数:20710 次

关于装箱拆箱的一点疑问
各位高手,小弟有一事不明。这是小弟写的代码
  int i = 56;
  object z = i; //装箱
  object m = i; //装箱
  Console.WriteLine("{0},{1},{2}", i, z, m);
  Console.WriteLine(object.Equals(z, m));
  Console.ReadKey();
为什么 Console.WriteLine(object.Equals(z, m));这句代码返回的是true。装箱不就是新创建一个object类型,然后把值赋值给这个引用类型,他们两个指向地址都不一样为什么相等?

------解决方案--------------------
小白太多。

我还是详细说说:

C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            User u1 = new User() { ID = 1, Name = "A" };
            User u2 = new User() { ID = 2, Name = "B" };
            Console.WriteLine(object.ReferenceEquals(u1, u2));
            Console.WriteLine(u1 == u2);
            Console.WriteLine(object.Equals(u1, u2));
            Console.WriteLine(u1.Equals(u2));
        }
    }
    class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public override bool Equals(object obj)
        {
            return true;
        }
    }
}

------解决方案--------------------
装箱和拆箱的本质并不是把值类型变成引用类型.
而是用一个引用类型的对象把值类型包装一下,真正到了使用的地方还是要拆箱的.
就是说,两个箱子,里面是一样的东西.你使用的时候是用的里面的东西,根本不会感觉到箱子的存在.但确实是两个箱子.