装箱和拆箱

装箱:值类型--->引用类型

拆箱:引用类型--->值类型

装箱拆箱会浪费一定的时间

判断是否发生了拆箱或者装箱,首先要判断这两种数据类型是否存在继承关系

装箱时用什么类型装的箱,拆箱时就该用什么类型拆箱

int num=10;
object obj=num;
double n=(double)obj;//此处报错,指定的转换无效
Animal an=new Dog();//这个叫隐式类型转换,不叫装箱
Dog dog=(Dog)an;//这个叫显示类型转换,不叫拆箱

方法重载时,如果具有该类型的重载,那就不叫拆箱或者装箱

int num=10;
Test(num);
public void Test(object obj){}
public void Test(int num){}//此时调用的是这个方法,不会发生装箱操作,调用最匹配的

接口与值类型之间的装箱与拆箱

int n=10;
IComparable com=n;//装箱

1、以下代码发生了几次装箱?

int n=10;
object o=n;//第一次装箱
n=100;
Console.WriteLine(n+","+(int)o);//(int)o发生了一次拆箱

答案:3次装箱,1次拆箱

用“+”连接字符串时,内部会调用string.Concat(),重载很多,此处调用的是string.Concat(object,object,object),所以在第一个和第三个参数时,都发生了一次装箱

2、以下代码装箱了?如果发生了装箱,请说明哪句代码装箱了,为什么?

int n=10;
string s1=n.ToString();
string s2=n.GetType().ToString();
Console.WriteLine(s1+"			"+s2);

答案:1次装箱

由于GetType()不是虚方法,子类没有重写,所以调用时需要通过object来调用

3、以下代码有没有发生装箱?如果有,几次?

string s1="a";
int n=10;
double d=9.9;
object o=10;//装箱
string s2="X";
string s3=s1+n+d+o+s2;
Console.WriteLine(s3);

答案:3次装箱

用“+”连接字符串时,内部会调用string.Concat(),重载很多,此处调用的是string.Concat(new object[]),所以n,d都发生了一次装箱