拆箱与装箱是一个早就接触的知识点,但是自己并没有系统的总结过,今天我们就来看一下:
一、首先介绍几个知识点:
值类型:
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。于是,要将值类型数据加入容器时,需要装箱。
其实我理解这拆箱和装箱和寄快递是一样的,邮递前你需要包装,到最后还需要拆开,但是不能说包装没有用,它起到了方便运输的作用。