装箱拆箱

我原来对于装拆箱的理解只是停留在将值类型转化为Object类型,然后再转换回来。实际上,在这个看似简单的问题上还有一层更深的含义。

值类型和引用类型在实例化的时候是存储在不同的空间中的,值类型存储在Stack上,而引用类型是存储在Heap上,在装箱的过程中实际上是将在Stack上的值类型对象拷贝到Heap上,并以引用对象的存储格式保存,在这个过程中对所转换的引用类型对象进行修改操作,Stack上的值类型对象是不会变化的。而拆箱是将引用对象的值在拷贝回Stack上。

下面我们来看一个例子:

首先需要一个值类型,让它继承自一个接口

public interface IAdjustor

    {

        void Adjust();

    }

 

    public struct Size : IAdjustor

    {

        public int height;

        public int weight;

        public void Adjust()

        {

            height += 2;

            weight += 3;

        }

 }

然后,再用ClientApp测试一下:

class Program

    {

        static void Main (string[] args)

        {

            Size s = new Size();

            s.Adjust();

            Console.WriteLine("height:" + s.height + " weight:" + s.weight);

            IAdjustor itf = s;  //In box

            itf.Adjust();

            Console.WriteLine("height:" + s.height + " weight:" + s.weight);

            s = (Size)itf;      //Un box

            Console.WriteLine("height:" + s.height + " weight:" + s.weight);

            Console.Read();

        }

 }

    输出结果如下:

height:2 weight:3

height:2 weight:3

height:4 weight:6

从结果不难看出,在装箱后IAdjustor itf = s,调用已为引用对象的Adjust()方法,相应的值类型对象并没有发生变化。在拆箱后s = (Size)itf;,值类型对象就变化了

你可能感兴趣的:(装箱拆箱)