装箱:将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程,拆箱则反之
对装箱的定义做几个简单的例子的说明吧,比较基础。
1.只是类型转换,但都是值类型,不叫装箱
int n = 10; double d = n; Console.WriteLine(d);
2.是将值类型转换为了引用类型,但是不叫装箱
int n = 10; string s = n.ToString();//string与int是完全不同的两种类型,没有父子类关系 //不可能发生装箱和拆箱,因为本身就不具备类型直接转换的功能 Console.WriteLine(s);
3.真正的装箱
int n = 10; object o = n; //n是int类型,int就是Int32,而Int32是一个结构继承字System.ValueType Console.WriteLine(o); //而该类又继承自Object,所以int类型与object类型具有子父类关系,所以可以发生类型转换
4.装箱拆箱的效率问题
装箱操作和拆箱操作因为转换,是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。
下面小例子显示与引入泛型后效率的对比
4.1.普通的Arraylist型需要装箱,1千万个数:效率 4s
ArrayList arrayList = new ArrayList();//arrayList集合无论装入什么数据,都变成object对象 Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000000; i++) { arrayList.Add(i); } watch.Stop(); Console.WriteLine(watch.Elapsed); Console.ReadKey();
4.2.泛型是不需要装箱的, 1千万个数:效率 0.3s
List<int> list = new List<int>(); Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000000; i++) { list.Add(i); } watch.Stop(); Console.WriteLine(watch.Elapsed); Console.ReadKey();
说点什么
欢迎讨论