在 .NET 中,装箱(Boxing)和拆箱(Unboxing)是两种用于在值类型(如 int, double 等)和引用类型(如 object)之间转换的操作。 装箱是将值类型转换为引用类型,拆箱是将引用类型转换为值类型。

1、装箱

装箱是指将值类型转换为引用类型(通常是 object 类型)的过程。在这个过程中,.NET 运行时会在托管堆上创建一个新的对象,然后将值类型的值复制到新对象中。

int age = 24;
object refAge= age;

可以看的出,第一条语句创建一个变量age,并将值放在托管栈中;

第二条语句将age的值赋给引用类型。它将值24放在托管堆中。

这个值类型包装为引用类型的过程,称为装箱。

2、拆箱

拆箱是指将引用类型转换回值类型的过程。拆箱操作涉及到检查对象实例是否是给定值类型的实例,如果是,就将值从对象实例中复制出来。

int  newAge = (int) refAge;
string newAge =(String) refAge;

拆箱的值必须和它要转换的目标的变量有相同的类型。

3、装箱和拆箱的问题

箱和拆箱会产生性能开销。这主要是因为装箱会将值类型复制到堆中,而拆箱会从堆中复制值类型。

1)性能考虑

频繁的装箱和拆箱操作可能会对性能产生负面影响,因为每次装箱都涉及到在堆上创建对象的开销。

2)类型安全

拆箱操作需要显式转换,并且在转换的类型不匹配时会抛出 InvalidCastException

3)使用场景

在需要将值类型作为引用类型处理时(例如,在使用非泛型集合如 ArrayList 时),装箱是不可避免的。但在可能的情况下,最好使用泛型集合来避免不必要的装箱和拆箱。

装箱和拆箱在C#中是必要的,但应当小心使用,避免它们带来的性能和设计问题。