装箱
表示值->引用,一般在ArrayList.Add(int a)时,会将a复制一份引用类型的数值,添加到ArrayList中。装箱分以下步骤:
1. 在托管堆中分配内存(包括类型对象指针和同步索引块)
2. 复制值
3. 返回地址引用
拆箱
表示从引用->值,比如int a=ArrayList[Index],这行代码分两步:
1. 拆箱,在托管堆中找到需要复制的字段地址
2. 从托管堆中复制到线程栈上
可以看出拆箱只要找地址,而装箱分三步,更复杂,所以一般少用回触发装箱机制的ArrayList而用List<T>
在拆箱时,只能拆成原类型,否则就会抛出异常,如string a= ArrayList[Index],这就会抛出InvalidCastException