装箱
装箱是将值类型转换为 object
类型或由值类型转换为该类型所继承的接口类型。
装箱的过程:值类型会在堆上分配一个对象实例并将值复制到新对象。 比如:
int i=123;
object o=i;
object o=i; 这行代码会在堆栈上创建一个引用对象 o
,在堆上的值是 int
i
的副本。所以在装箱后把变量 i
改为 789,不会影响 o
中存储的值。
拆箱
拆箱是从对象中提取值类型或从接口类型到实现操作类型的显式转换。
拆箱的过程:
-
检查给定的值类型是否符合对象类型
-
将实例中的值复制到值类型变量
object o=123;
short i=(short)o;//会抛出 InvalidCastException 异常,不能将 32 位的 int 转换为 16 位的 int
int i=(int)i;//拆箱成功
装箱拆箱过程有点类似深拷贝,但装箱拆箱的过程是非常消耗性能,而且我们在开发中就有一些非常不在意代码,切做着装箱拆箱,例如:
string.Concat("hello ",123,true);
ArrayList array =new ArrayList();//或使用 List<object>
array.Add(123);
array.Add("hello");
int i=(int)array[0];//拆箱
在开发中最好避免不必要的装箱拆箱。此外,发挥泛型的作用。
最后,祝大家学习愉快!