什么时候回发生装箱与拆箱? 当将值类型赋值给一个引用类型的时候会发生装箱。 把引用类型转换成值类型的时候会发生拆箱.

注意:装的时候是什么类型,拆的时候就应该还是什么类型。

经典例子

  1. //值类型与字符串是不可能拆装箱的。
  2. int n = 100;
  3. string s = Convert.ToString(n);//没有发生装箱
  4. int m = int.Parse(s);//没有发生拆箱
  5. //那为什么呢?
  6. //因为在调用Convert.ToString()这个方法时,并不是拷贝,而是在堆中开辟了一块内存空间并赋值为“100”。
  7. //第二条语句是将堆中的字符串转换成一个数值类型,并在堆中声明一个一样的。
  1. int n = 100;
  2. object o = n;//发生了装箱
  3. //这个语句具体执行是:将栈中存放的值类型拷贝一份放入堆中。
  4. int m = (int)o;//发生了拆箱
  5. //这个语句具体执行是:将堆中的引用类型拷贝一份放入栈中。
  1. int n = 100;
  2. IComparable com = n;//发生了装箱
  3. int m = (int)com;//发生了拆箱
  1. int n = 10;
  2. object o = n;
  3. double d = (double)o;//这种情况会报错的哦,看看注意事项
  4. double d = (int)o;//你可以这样来实现赋值,但拆的时候要对应装的时候哦。
  1. int n = 100;
  2. Console.WriteLine(n);//没有发生装箱
  3. Console.WriteLine("nihao{0}",10);//有装箱的
  4. //看是否拆箱装箱,就看方法中的参数类型是否一致(值类型与引用类型)
  1. 字符串拼接会调用一个方法,发生装箱。

装箱与拆箱对性能的影响

差距很大,所以不推荐使用ArrayList,使用泛型List。数据量越大,性能差距月明显。