装箱和拆箱最直接的意思就是装箱是把值类型变成引用类型,拆箱则是把引用类型变成值类型。
常见的值类型是:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
常见的引用类型是:数组,用户定义的类、接口、委托,object,字符串。
无论是拆箱还是装箱都会对性能造成影响所以要尽量避免项目中的拆装箱,那么到底怎么样的叫做拆装箱呢?
int n=10;
object o=n;(装箱)
int m=(int)o;(拆箱)
在这里我们把int(值类型)变成了object(引用类型),在这个过程中就发生了装箱,然后又通过里氏转换的方法把object(引用类型强转成了值类型)发生了拆箱。
以下举一个装拆箱的反例。
我们知道字符串是引用类型,那么使用Convert的方法可以把字符串转换成int类型。
string num="123";
int a=Convert.ToInt32(num);
在这个过程中把引用类型的值变成了值类型是否发生了拆装箱呢,答案是没有发生,拆装箱有一个隐式的条件是双方具有继承关系,像之前的例子object是所有类的父类,所以是能够发生装拆箱的过程的,而string和int是两个毫无交集的类型,一个在堆上一个在栈中,他们并无继承关系因此无法发生拆装箱(PS:不是所有的继承都能发生拆装箱,但是发生拆装箱了就会有继承。)
例子:为什么大家更喜欢使用泛型list集合而不经常使用ArrayList集合呢?明明ArrayList使用起来更加的方便,想添加什么类型就添加什么类型,原因就是Arraylist添加的类型是object,而你使用Add的方法添加一个int类型在这个过程中就会发生把值类型变成引用类型的装箱,会对性能造成影响,而使用定义好的List<T>就不会有这个问题了,这就是原因。