【C#】装箱和拆箱

401 阅读2分钟

装箱

值类型转成引用类型。

拆箱

引用类型转值类型。

何为值类型?

一、数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。值类型包括:

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的都是值类型。

这种拆箱和装箱操作,看似是类型转换,为什么要叫装箱和拆箱?

因为这种转换涉及到存储上的变化,由堆到栈,和栈到堆都是需要消耗资源的

堆栈 的详细讲解 可以看下面这篇文章

www.cnblogs.com/zd1994/p/44…

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是所有类型的跟父类),所以必须装箱。 对于已装箱的对象,因为无法直接调用其指定方法,所以必须先拆箱,再调用方法,但再次拆箱,会生成新的栈实例,而无法修改装箱对象。这样消耗资源很大!