这是一个好问题,因为它看上去高大上,甚至跨学科和领域,实际上,它只是一个非常简单的问题,但是,很多编程新手,被这个“装箱和拆箱”的名称给整蒙圈了。就直接从它面前绕过去了,以至于每每遇到就如鲠在喉,编程一个心结。这玩意,究竟是个啥呢?既然出现在编程语言里,肯定不会是一个物流名词,那它究竟是个啥操作呢?
好的,今天面对这个简单问题,咱们不绕开,仔细的把它说清楚。
C# 采用统一的类型系统,因此任意类型的值都可视为object。每种C#类型都直接或间接地派生自object类型,而object是所有类型的最终基类。
只需将值视为类型object,即可将指定类型的值视为对象。通过执行装箱和拆箱操作,就可以将值类型的值视为对象。在以下示例中,int值被转换成object,然后又恢复成int。
using System;
class BoxingExample
{
static void Main()
{
int x = 123;
object obj = x; // 装箱
int y = (int)obj; // 拆箱
}
}
那么,上面这个操作过程,我们就称之为装箱和拆箱。
装箱:当值类型的值转换成 object 类型时,将分配object实例(亦称为“箱”)来包含值,然后该值会复制到相应的箱中。
拆箱:当object引用被显式转换成值类型时,将检查引用的object是否是具有正确值类型的箱;如果检查成功,则会将箱中的值复制出来。
C#的统一类型系统实际上意味着可以”按需”将指定的类型转换成对象,然后,还能显式地将对象转换成指定的类型。
实际上,装箱和拆箱的常规用途就是实现引用类型和值类型的转换。
当然,我们需要注意的是这个操作看起来很简单,但如非必须,却是没有必要这么干的。特别是当值类型装箱操作以后,就变成引用类型,不仅增大内存占有,还会降低使用效率。虽然,这样的变化一般用户是无法察觉的,但是,追求更好的性能难道不是咱们程序员应该追求的美德吗?