提到装箱和拆箱,都知道值类型到引用类型是装箱,引用类型到值类型是拆箱。
那么现在看下面一个demo
class Program
{
static void Main(String[] args)
{
int n=100;
string s=Convert.ToString(n);
int m=int.Parse(s);
Console.ReadKey();
}
}
上面这段程序看着是发生了装拆箱,其实并没有发生装拆箱。
int n=100;
object o=n; //发生装箱
int m=(int) o;
下面这段代码就发生了装箱和拆箱。
原理:第二段代码int n=100,相当于在内存栈中分配一个空间,把100的值存进去。object o=n,就是在栈中先分配一个变量o,然后在堆里面在开辟一个空间,把100复制一份放到这个空间里面。然后让o指向了这个对象,这就发生了一次装箱。
拆箱就是在堆里面直接找到整形100他所存在的位置,把他拷贝一份拷贝到m里面这就是拆箱。
现在咱们来看看demo1的代码和demo2的代码有啥不一样:
string类型中是不可能放int类型的,不是把n的值直接拷贝到string类型中,而是在string类型中构造一个字符串。“100”,然后让s指向他。创建了一个全新的数据类型。所以这两种类型看起来差不多,其实不一样。装箱拆箱的前提条件就是具有父子类关系。
装箱就是把值类型直接拷贝到堆里面,拆箱就是直接从堆中找到这个值。