C#中值类型和和引用类型实质上是同源的,所以不但可以从值类型和引用类型之间进行转换,也可以在值类型和引用类型之间进行转换。,但是两者使用的内存类型不同,使他们的转换变得复杂。

1.装箱:

  在C#中通常将值类型转换成引用类型叫做装箱。

C#中值类型装箱为引用类型的过程如下:

  •   在托管堆中创建一个新的对象实例,并分配相应的内存。
  •   将值类型变量值复制到对象实例中。
  •       将对象实例地址压入堆栈中,并指向一个引用类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int mm = 50;    //定义值类型变量
            object nn = mm; //将值类型变量装箱到引用型类型汇总
            Console.WriteLine("值为{0},装箱对象为{1}",nn,mm);

            mm = 100;       //改变值
            Console.WriteLine("值为{0},装箱对象为{1}", mm, nn);

            Console.ReadKey();
        }
    }
}

运行结果如下:

 

2.拆箱:

  在C#中通常将引用类型转换成值类型叫做拆箱。C#中一个引用类型拆箱成一个值类型的流程如下:

  • 检查该对象的实例是否是某个给定的值类型装箱后的值。
  • 如果是则将值从实例中复制出来。
  • 赋值给值类型变量。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int mm = 50;
            object nn = mm;
            Console.WriteLine("装箱:值为{0},装箱对象为{1}", mm, nn);
            int zz = (int)nn;//取消装箱=拆箱
            Console.WriteLine("拆箱:装箱对象为{0},值为:{1}",nn , zz);
            Console.ReadKey();
        }
    }
}