📜  C#|装箱与拆箱(1)

📅  最后修改于: 2023-12-03 15:30:18.289000             🧑  作者: Mango

C# 装箱与拆箱

在 C# 中,值类型(例如 intbooldouble 等)和引用类型(例如 stringobject、自定义类等)是不同的。值类型直接存储在栈中,而引用类型则是在堆中分配内存并保留引用。这些类型之间的转换称为装箱和拆箱。

装箱

装箱是将值类型转换为引用类型的过程。在装箱时,将值类型的值放入一个对象中,然后将该对象引用返回。实际上,装箱创建了对象的新实例,并在堆上分配了内存。下面是一个装箱的示例:

int x = 42;
object obj = x; // 装箱

在这个示例中,int 类型的变量 x 被装箱并放入了一个新的 object 对象中。现在,我们可以使用 obj 对象来访问 x 的值,但是这需要进行拆箱操作。

拆箱

拆箱是从对象中提取值类型值的过程。在拆箱时,将引用转换回原始值,并将该值存储在栈上。实际上,拆箱删除了装箱时创建的对象实例,并将其转换回原始值。下面是一个拆箱的示例:

int y = (int)obj; // 拆箱

在这个示例中,我们从 obj 对象中提取了整数值,并将其存储在 y 变量中。请注意,我们需要将对象转换回 int 类型,并使用强制类型转换运算符将其转换为目标类型。

性能考虑

装箱和拆箱是相对耗时的操作,因为它们涉及到内存的分配和数据的拷贝。如果我们经常进行装箱和拆箱操作,可能会导致性能瓶颈。为了提高性能,我们应该尽可能避免装箱和拆箱操作。

总结

装箱和拆箱是将值类型转换为引用类型的过程,以及从引用类型提取值类型的过程。它们是相对耗时的操作,应该尽可能避免。在实践中,我们应该遵循以下准则:

  • 尽可能使用值类型而不是引用类型。
  • 避免在容器(如集合和数组)中存储值类型,因为这可能导致大量的装箱和拆箱操作。
  • 当必须使用装箱和拆箱时,使用 as 关键字而不是强制类型转换运算符进行类型转换,因为 as 运算符不会抛出异常。