装拆箱

装箱(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();

装拆箱:

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

查看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();

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

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

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

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

还是得查看一下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();

运行结果:

使用泛型:

 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();

运行结果:

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

时间: 2024-11-13 20:42:56

装拆箱的相关文章

Integer自动装拆箱

public static void main(String[] args) { Integer a1 = 1; Integer a2 = 1; Integer b1 = 127; Integer b2 = 127; Integer c1 = 128; Integer c2 = 128; Integer d1 = 321; Integer d2 = 321; System.out.println(a1 == a2); System.out.println(b1 == b2); System.ou

Java自动装/拆箱下,三目运算符的潜规则

最近发现了一个很诡异的NullPointerException,在下面这个方法抛出,一开始怎么都没想明白,dSrc即使为null,那直接赋值给distinct也没问题啊. private Doubledistinct; private void setParam(Double dSrc, boolean flag) { this.distinct = (flag) ? dSrc : 0d; } 最后才发现是Java自动拆箱的潜规则,下面我们来看看其所以然. 自动装箱/拆箱 在JDK1.5引入自动

C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)

一.数值类型及其调用原理 名称 说明 所占字节 范围 byte 字节型 1 -27~27-1 short 短整型 2 -215~215-1 int 整型 4 -231~231-1 long 长整型 8 -263~263-1 char 字符型 1 0~65535 float 单精度型 4 ±1.5*10-45~±3.4*1038 double 双精度型 8 ±5.0*10-324~±1.7*10308 bool 布尔型 1 只有true和false两个值 static void Main(stri

17.2015.08.04第十八节课 C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)

一.数值类型及其调用原理 名称 说明 所占字节 范围 byte 字节型 1 -27~27-1 short 短整型 2 -215~215-1 int 整型 4 -231~231-1 long 长整型 8 -263~263-1 char 字符型 1 0~65535 float 单精度型 4 ±1.5*10-45~±3.4*1038 double 双精度型 8 ±5.0*10-324~±1.7*10308 bool 布尔型 1 只有true和false两个值 static void Main(stri

有关包装类拆箱、装箱和整型与字符串型之间的转换

原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5462489.html 1.8种基本数据类型都有各自的包装类,其对应关系为: 基本————————————包装类 byte————————————Byte short———————————Short char————————————Char int————————————Integer long————————————Long float————————————Float double———

C# 知识回顾 - 装箱与拆箱

装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ,下单成功后,卖家会帮你将这本入坑指南打好包装,我们可以称之为装箱:经过快递员的快马加鞭,风雨无阻,包裹就直接送到你手上了.你一定会以迅雷不及掩耳盗铃儿响叮当之势拆开包装,这个过程我们可以称之为拆箱,这时,入坑指南就顺利的送到你手上. C# 的装箱与拆箱 装箱:将值类型(如 int ,或自定义的值类

C#装箱与拆箱

装箱:将值类型转换成引用类型的的一种机制. 拆箱:获取已装箱对象中被装箱字段的地址:值得注意的是拆箱并不是装箱的逆过程. 如果你不知道怎么看自己的代码是不是发生了装箱,一个简单的方法就是通过visual studio自带的IL反编译工具查看, 如下面的代码,大家可以在IL指令中去找box,如果哪里出现它,就说明这里发生了装箱 当然,上面的代码大家一般不会这么写,这里只是告诉大家怎么去自己的代码你去找装箱发生的地方. 我把上面的代码注释了,重写了一行代码,重新打开IL反编译工具,大家看看有什么不同

.Net学习笔记----2015-06-25(File类的读写文件、List泛型集合、装箱和拆箱、Dictionary字典集合)

File类:静态类,Create Delete Copy Move ,主要用来对数据对文本文件进行读写 File类:缺点:只能读写小文件 读写操作: //byte[] buffer = File.ReadAllBytes(@"C:\Users\Administrator\Desktop\new.txt"); ////将字节数组中的每一个元素都要按照我们指定的编码各式解码成字符串 ////UTF-8 GB2312 GBK ASCII Unicode //string s = Encodi

教学-44 命名空间和装箱拆箱

曾英-C#教学-44 命名空间和装箱拆箱 目录 1\认识命名空间,学习如何定义使用命名空间 2\学习如何使用帮助 3\理解装箱和拆箱操作 1\命名空间 以下都是.Net内部定义的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace是自己定义的 namespace _44_命名空间 1.1\namespace 如果没有定义不同的命名空间的话,在出现相同