装箱
值类型转成引用类型。
拆箱
引用类型转值类型。
何为值类型?
一、数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。值类型包括:
1、所有数字数据类型 2、Boolean、Char和Date
3、所有结构,即使其成员是引用类型
4、枚举,因为其基础类型总是SByte、Short、Integer、Long、Byte、UShort、UInteger或ULong
Object类型是 所有类型 的基类(父类),其下面有ValueType类型。什么结构啊,枚举啊,都继承ValueType,这些都是值类型。
何为引用类型?
二、“引用类型”包含指向存储数据的其他内存位置的指针。引用类型包括:
1、String(字符串)
2、所有数组,即使其元素是值类型
3、类类型,如Form
4、委托
总而言之,直接继承Object的都是引用类型,继承ValueType的都是值类型。
这种拆箱和装箱操作,看似是类型转换,为什么要叫装箱和拆箱?
因为这种转换涉及到存储上的变化,由堆到栈,和栈到堆都是需要消耗资源的
堆栈 的详细讲解 可以看下面这篇文章
int i = 5;
object obj = i; //装箱操作,要尽量避免装箱
d=(double)obj; //拆箱操作,影响性能,也要尽量避免拆箱操作
//隐式转换:不需要声明就能转换的转换(通俗来说,)
int i=55;
double d=i;
//显式转换:又称“强制转换”(大类型转小类型,会有精度上的损失)
double d2=13.14;
int i2=(int)d2; //这里i2 的值为13
int y=Convert.ToInt32(x);
装箱:值类型转换为引用类型(隐式转换)
拆箱:引用类型转换为值类型(显式转换)
为什么需要装箱和拆箱呢?
学习装箱,是为了尽量避免装箱,装箱往往是被迫的(例如上面的 int 转Object)。 在C#没有支持泛型之前,为了使某些程序具有通用性,使用到了Object(Object是所有类型的跟父类),所以必须装箱。 对于已装箱的对象,因为无法直接调用其指定方法,所以必须先拆箱,再调用方法,但再次拆箱,会生成新的栈实例,而无法修改装箱对象。这样消耗资源很大!