定义
装箱是将值类型装换成引用类型的过程;拆箱就是将引用类型转换成值类型的过程;
装箱: 用于在垃圾回收堆中储存值类型。装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换。
拆箱: 从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。
这里是值类型和引用类型的转换,不单单是父类和子类的转换
数据类型的分类
变量是如何存储的
我们首相要明白,值类型的变量是存储在栈上面,而引用类型是存储在堆上面
值类型存储方式
我们首先定义一个简单变量
int x=10;
我们知道,int类型存储空间是4字节(1字节=8bit);
我们定义x后,它会在内存开辟一个32bit的空间进行存储值。我们给x赋值是10,所以里面存储的值是1010,前面的都用0来表示。
这就是值类型存储方式,在存储中申请一个自身变量类型的存储空间进行存储数据。
引用类型存储方式
object y=10;
我们声明一个object类型的y存储数据10,首先在栈开辟一个4个字节的空间(注意:引用类型都是首先在栈开辟四个自己的空间)在堆上面开辟一个int类型的字节存储值,并且返回一个地址,该地址210005存储的是10,object空间存储的就是210005的内容,所以访问object首先通过存储的地址找到210005再得到存储的数据10.
装箱操作
用我们上面两个int和object变量来进行说明装箱和拆箱
int x=10;
object y=x;
其中y=x的操作就是装箱操作。其过程首先开辟y的存储空间4个字节,在堆中开辟空间拷贝x存储空间中的内容,再对应的地址存储到y的存储空间中。
拆箱操作
object y=10;//这里不是装箱操作
int x=(int)y;
该操作是开辟x的存储空间,通过y存储的地址访问到数据,再拷贝地址存储的数据到x存储空间中。
总结
所以拆箱和装箱要进行地址的访问和拷贝,项目中的大量拆箱和装箱会大大的加大性能的损耗。所以我们在项目中要尽量避免装箱和拆箱的操作。
一个实用的避免方法—泛型
using System;
namespace 装箱拆箱
{
class Program
{
static void Main(string[] args)
{
num("皮学渣");//这里的操作是首先声明一个string类型变量存储‘皮学渣‘ 信息,然后装箱成object类型再进行输出。
num2("皮学渣");//这里才用泛型的操作,c#会自动识别类型,从而避免了装箱拆箱。所以我们可以使用泛型来进行避免
Console.ReadKey();
}
static void num(object obj)
{
Console.WriteLine(obj);
}
static void num2<T>(T val )
{
Console.WriteLine(val);
}
}
}