C#装箱和拆箱
装箱与拆箱(又叫取消装箱)就是值类型与引用类型的转换,是值类型和引用类型之间的桥梁。
之所以可以这样转换是因为 CTS 允许这样做。只有值类型才存在装箱和拆箱。
装箱是隐式的,拆箱是显式的,因为你需要告诉 CLR 你要给拆出来的值赋予什么类型。
通过深入了解装箱与拆箱的过程,我们可以知道其中包含了对堆上内存的操作,故会消耗性能,这是完全不必要的。
另外值得注意的是,装箱需要比原数据更多的空间,因为它需要两个引用类型的标准配置:类型对象指针和同步块索引。
装箱的过程
装箱就是把值类型转换为 object 类型或由此值类型实现的任何接口类型,如下图所示:
int i = 1; object o = i;
具体过程:
- 在堆中申请内存,内存大小为值类型的大小,再加上额外固定空间(类型对象指针和同步块索引)。
- 将值类型的字段值拷贝到新分配的内存中。
- 返回新引用对象的内存地址(给栈上的引用)。
本文标题:C#装箱和拆箱
发表评论