拆箱是将引用类型转换为值类型 ;反之,装箱! 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来 ; [csharp] 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = ",obj); 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = ",obj); 这是一个装箱的过程,是将值类型转换为引用类型的过程 [csharp] int val = 100; object obj = val; int num = (int) obj; Console.WriteLine ("num: ",num);<SPAN style="LINE-HEIGHT: 24px; FONT-FAMILY: arial, 宋体, sans-serif; FONT-SIZE: 14px"> </SPAN> int val = 100; object obj = val; int num = (int) obj; Console.WriteLine ("num: ",num); 这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程 显然,从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。看下面代码 [csharp] class Program { static void Main(string[] args) { //// 用时:00:00:01.6070325(跟电脑运行效率有一定关系) //ArrayList list = new ArrayList(); //Stopwatch watch = new Stopwatch(); //watch.Start(); //for (int i = 0; i < 10000000; i++) //{ ////使用ArrayList集合,每次增加一个数字都会发生装箱操作。 // list.Add(i); //} //watch.Stop(); //Console.WriteLine(watch.Elapsed); //Console.ReadKey();/ //用时:00:00:00.1402388,使用泛型集合后,省去了装箱与拆箱操作,性能大大提升。 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(); } } class Program { static void Main(string[] args) { //// 用时:00:00:01.6070325(跟电脑运行效率有一定关系) //ArrayList list = new ArrayList(); //Stopwatch watch = new Stopwatch(); //watch.Start(); //for (int i = 0; i < 10000000; i++) //{ ////使用ArrayList集合,每次增加一个数字都会发生装箱操作。 // list.Add(i); //} //watch.Stop(); //Console.WriteLine(watch.Elapsed); //Console.ReadKey();//使用泛型集合后,省去了装箱与拆箱操作,性能大大提升。 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(); } } 总结: 1.装箱、拆箱必须是:值类型→引用类型 或 引用类型→值类型。 object,接口。值类型是可以实现接口。 Personp=new Student();//这个叫隐式类型转换,不叫装箱。 Studentstu=(Student)p;//这个叫显示类型转换,不叫拆箱。 int类型为什么能装箱到object类型,但不能装箱到string类型或Person类型, 因为object类型时int类型的父类。 2.拆箱时,必须用装箱时的类型来拆箱 装箱时如果是int,拆箱必须用int,不能用double 3.方法重载时,如果具有该类型的重载,那么就不叫拆箱或装箱。 4.字符串连接 string s1 = "a"; string s2 = "b"; int n3 = 10; double d4 = 99.9; string result = string.Concat(s1, s2, n3, d4); string s1 = "a"; string s2 = "b"; int n3 = 10; double d4 = 99.9; string result = string.Concat(s1, s2, n3, d4); //string.Concat(s1,s2, n3, d4); 判断是否发生了装箱,及次数。 //string.Concat(s1,s2, n3, d4); 判断是否发生了装箱,及次数。 |