装箱与拆箱
Posted wesley1680
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装箱与拆箱相关的知识,希望对你有一定的参考价值。
把值类型转换为引用类型,叫装箱。把引用类型转换为 值类型,称之为拆箱。
看例子:
1 int n = 10; 2 string s = n.ToString();//不是装箱 3 4 5 object o = 10;//是装箱 6 7 Console.ReadKey();
1.定义。
2.转换的两个类型能自动兼容另一个类型。(更本质的说,二者存在直系的继承关系,而不是兄弟关系)
int继承于valuetype,valuetype继承于object. string 直接继承object. 所以int和string不是父子类关系(是分支上的兄弟关系),也不能自动转换。
装箱或者拆箱的两个类型必须是有父子类关系的。对于toString()方法,是把一种类型转换为了另一种类型(会在内存 中开辟空间),int和string类型本身不会有自动转换的功能,所以第一种情况不是装箱。
1 Person p = new Person(); 2 object op = p;//不是装箱,二者都是引用类型。 3 int i = 10; 4 double d = i; 5 int di = (int)d;//不是拆箱,因为二者都是值类型 6 7 object o1 = 10;//是装箱。 8 int oi=(int)o1;//是拆箱。 9 10 Console.ReadKey();
注意:
1 double d = 10; 2 object o = d; 3 int i = (int)o; 4 Console.WriteLine(i);
上面的代码包含装箱和拆箱,但是在拆箱的时候会报错。装箱装进去的什么类型,拆箱的时候也必须用相同的类型接收。
效率问题:
1 //ArrayList arr = new ArrayList(); 2 //Stopwatch stop = new Stopwatch(); 3 //stop.Start(); 4 //for (int i = 0; i < 20000000; i++) 5 //{ 6 // arr.Add(i);//耗时:00:00:04.3049126 7 //} 8 //stop.Stop(); 9 //Console.WriteLine(stop.Elapsed); 10 11 List<int> list = new List<int>(); 12 Stopwatch stop = new Stopwatch(); 13 stop.Start(); 14 for (int i = 0; i < 20000000; i++) 15 { 16 list.Add(i);//耗时:00:00:00.3916002 17 } 18 stop.Stop(); 19 Console.WriteLine(stop.Elapsed);
很明显,装箱和拆箱很耗性能。
案例:
1 int m = 10, n = 11; 2 string s1 = "a"; 3 string s2 = "32"; 4 5 string str = m + s1 + n + s2;//这里发生了两次装箱.会把int装入object. 6 //string str = m + n + s1 + s2;//只发生了一次装箱.先把m+n计算出来,然后装箱。 7 int p = int.Parse(str); 8 9 Console.WriteLine("{0}",p);//发生了一次装箱,参数传递的是object类型。 10 //Console.WriteLine(p);//没有装箱。
以上是关于装箱与拆箱的主要内容,如果未能解决你的问题,请参考以下文章