什么时候回发生装箱与拆箱? 当将值类型赋值给一个引用类型的时候会发生装箱。 把引用类型转换成值类型的时候会发生拆箱.
注意:装的时候是什么类型,拆的时候就应该还是什么类型。
经典例子
//值类型与字符串是不可能拆装箱的。
int n = 100;
string s = Convert.ToString(n);//没有发生装箱
int m = int.Parse(s);//没有发生拆箱
//那为什么呢?
//因为在调用Convert.ToString()这个方法时,并不是拷贝,而是在堆中开辟了一块内存空间并赋值为“100”。
//第二条语句是将堆中的字符串转换成一个数值类型,并在堆中声明一个一样的。
int n = 100;
object o = n;//发生了装箱
//这个语句具体执行是:将栈中存放的值类型拷贝一份放入堆中。
int m = (int)o;//发生了拆箱
//这个语句具体执行是:将堆中的引用类型拷贝一份放入栈中。
int n = 100;
IComparable com = n;//发生了装箱
int m = (int)com;//发生了拆箱
int n = 10;
object o = n;
double d = (double)o;//这种情况会报错的哦,看看注意事项
double d = (int)o;//你可以这样来实现赋值,但拆的时候要对应装的时候哦。
int n = 100;
Console.WriteLine(n);//没有发生装箱
Console.WriteLine("nihao{0}",10);//有装箱的
//看是否拆箱装箱,就看方法中的参数类型是否一致(值类型与引用类型)
字符串拼接会调用一个方法,发生装箱。
装箱与拆箱对性能的影响
差距很大,所以不推荐使用ArrayList,使用泛型List。数据量越大,性能差距月明显。