装箱:值类型--->引用类型
拆箱:引用类型--->值类型
装箱拆箱会浪费一定的时间
判断是否发生了拆箱或者装箱,首先要判断这两种数据类型是否存在继承关系
装箱时用什么类型装的箱,拆箱时就该用什么类型拆箱
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都发生了一次装箱