2024-05-13 · C# 基础 · 学习笔记

装箱与拆箱

装箱(boxing)是值类型转 object 或接口类型的过程,会在堆上分配内存并复制值。拆箱(unboxing)是反向转换,需要强制类型转换。频繁装箱会影响性能。

这就是为什么泛型集合 List<int> 比 ArrayList 快的原因:ArrayList 存的是 object,每次 Add 都装箱,每次访问都拆箱。List<int> 直接存 int,没有装箱开销。

什么时候会装箱?1) 值类型传给接受 object 的方法;2) 值类型放到非泛型集合;3) 值类型调用 GetType()(装箱)。避免不必要的装箱是性能优化的基本点。

代码示例

// 装箱:int -> object(堆分配)
int num = 42;
object boxed = num; // 隐式装箱
Console.WriteLine(boxed);

// 拆箱:object -> int(强制转换)
int unboxed = (int)boxed; // 显式拆箱

// 性能对比:ArrayList vs List<int>
// ArrayList:每次 Add 都装箱
var arrayList = new System.Collections.ArrayList();
for (int i = 0; i < 1000; i++)
{
    arrayList.Add(i); // 装箱
    int x = (int)arrayList[i]; // 拆箱
}

// List<int>:没有装箱
var genericList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    genericList.Add(i); // 无装箱
    int x = genericList[i]; // 无拆箱
}
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。