首页 > 代码库 > 拆箱与装箱

拆箱与装箱

     拆箱与装箱是一个早就接触的知识点,但是自己并没有系统的总结过,今天我们就来看一下:

     一、首先介绍几个知识点:

     值类型:

1. 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。

2. 值类型超出作用范围系统自动释放内存。

3. 主要由两类组成:结构,枚举(enum),结构分为以下几类:

1. 整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong)

2. 浮点型(Float、Double)

3. decimal

4. bool

5. 用户定义的结构(struct)

 引用类型。

1. 引用类型在堆中分配内存,初始化时默认为null。

2. 引用类型是通过垃圾回收机制进行回收。

3. 包括类、接口、委托、数组以及内置引用类型object与string。

二、.什么是拆箱与装箱?

由于C#中所有的数据类型都是由基类System.Object继承而来的,所以值类型和引用类型的值可以通过显式(或隐式)操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。

1、装箱和拆箱是一个抽象的概念 

2、装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型 
      利用装箱和拆箱功能,可通过允许值类型的任何值与Object类型的值相互转换,将值类型与引用类型链接起来 
例如: 
int val = 100; 
object obj = val; 
Console.WriteLine (“对象的值 = {0}", obj); 
这是一个装箱的过程,是将值类型转换为引用类型的过程 

int val = 100; 
object obj = val; 
int num = (int) obj; 
Console.WriteLine ("num: {0}", num); 
这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程 

注:被装过箱的对象才能被拆箱

三、.为什么要进行拆箱与装箱?

一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。 
另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

   其实我理解这拆箱和装箱和寄快递是一样的,邮递前你需要包装,到最后还需要拆开,但是不能说包装没有用,它起到了方便运输的作用。

 

拆箱与装箱