码迷,mamicode.com
首页 > 其他好文 > 详细

装拆箱

时间:2017-09-27 11:38:23      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:系统   string   logs   equals   cat   splay   unbox   dbf   png   

装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念。装箱就是将一个值型转换为引用型对象。拆箱就是将一个引用型对象转换成任意值型!

技术分享
1             int n = 100;
2             //有没有发生装箱?没有,只是调用方法.查看IL没有box,unbox关键字
3             string s = Convert.ToString(n);
4             int m = int.Parse(s);
5             Console.ReadKey();
View Code

装拆箱:

技术分享
1             int n = 100;
2             object o = n;//发生了一次装箱
3             int m = (int)o; //发生了一次拆箱
4             Console.WriteLine(m);
5             Console.ReadKey();
View Code

查看IL代码如下:

技术分享

注意问题:装箱的时候是什么类型,拆箱的时候也必须使用对应的类型拆箱。否则会报错

技术分享

=============================================================================================

之前写了一篇比较是否为同一对象(比较是否为同一对象),object.ReferenceEquals如果两个参数都是值类型会是怎样的呢?

 

技术分享
1            int n = 100;
2             int m = 100;
3             Console.WriteLine(n.Equals(m));
4             Console.WriteLine(object.ReferenceEquals(n, m));
5             Console.ReadKey();
View Code

 

运行结果是false,我们来查看下IL代码,很明显,n和m都装箱变为了引用类型,它们所指向的地址不一样,无论如何都是不成立的

 

技术分享

=================================================================================

拼接字符串也会涉及装箱问题:比如:

技术分享
1             int n = 10;
2             object o = n; //装箱一次
3             n = 100;
4             Console.WriteLine(n + "," + (int)o); //装箱两次,拆箱一次
5             Console.ReadKey();
View Code

还是得查看一下IL代码:因为拼接字符串是调用string.Concat(object,object,object)这个方法,每拼接一个字符串会把int隐式装箱再连接

技术分享

======================================================================

装箱和拆箱性能问题

使用ArrayList:

技术分享
 1             ArrayList arrInt = new ArrayList();
 2             Stopwatch watch = new Stopwatch();
 3             watch.Start();
 4             for (int i = 0; i < 1000000; i++)
 5             {
 6                 arrInt.Add(i);
 7             }
 8             watch.Stop();
 9             Console.WriteLine(watch.Elapsed);
10             Console.ReadKey();
View Code

运行结果:技术分享

使用泛型:

技术分享
 1     //使用泛型集合避免装箱和拆箱。
 2             List<int> arrInt = new List<int>();
 3             Stopwatch watch = new Stopwatch();
 4             watch.Start();
 5             for (int i = 0; i < 1000000; i++)
 6             {
 7                 arrInt.Add(i);
 8             }
 9             watch.Stop();
10             Console.WriteLine(watch.Elapsed);
11             Console.ReadKey();
View Code

运行结果:技术分享

这可以看出装拆箱还是比较影响性能的

 

装拆箱

标签:系统   string   logs   equals   cat   splay   unbox   dbf   png   

原文地址:http://www.cnblogs.com/entclark/p/7600523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!