一、定义:

简单来说:装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。

装箱:用于在垃圾回收堆中储存值类型。装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换。

拆箱:从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。

二、为何需要装箱?(为何要将值类型转为引用类型?)

一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。

另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

三、装箱/拆箱的内部操作。 
装箱: 
对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。 
第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)。 
第二步:将值类型的实例字段拷贝到新分配的内存中。 
第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。 
有人这样理解:如果将Int32装箱,返回的地址,指向的就是一个Int32。我认为也不是不能这样理解,但这确实又有问题,一来它不全面,二来指向Int32并没说出它的实质(在托管堆中)。 
拆箱:
检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。 
有 书上讲,拆箱只是获取引用对象中指向值类型部分的指针,而内容拷贝则是赋值语句之触发。我觉得这并不要紧。最关键的是检查对象实例的本质,拆箱和装箱的类 型必需匹配,这一点上,在IL层上,看不出原理何在,我的猜测,或许是调用了类似GetType之类的方法来取出类型进行匹配(因为需要严格匹配)。

四、装箱/拆箱对执行效率的影响 
显然,从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。 
那该如何做呢? 
首先,应该尽量避免装箱。 
比如上例2的两种情况,都可以避免,在第一种情况下,可以通过重载函数来避免。第二种情况,则可以通过泛型来避免。 
当然,凡事并不能绝对,假设你想改造的代码为第三方程序集,你无法更改,那你只能是装箱了。 
对于装箱/拆箱代码的优化,由于C#中对装箱和拆箱都是隐式的,所以,根本的方法是对代码进行分析,而分析最直接的方式是了解原理结何查看反编译的IL代码。比如:在循环体中可能存在多余的装箱,你可以简单采用提前装箱方式进行优化。

装箱和拆箱分别什么意思?相关推荐

  1. 关于Visual C#装箱与拆箱的研究

    关于Visual C#装箱与拆箱的研究 2004-09-15  作者: 出处: CSDN 在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题. 观者也许曾无数次的使 ...

  2. Java中的自动装箱和拆箱

    自动装箱和拆箱 自动装箱和拆箱 自动装箱: 拆箱 1. 为什么要有包装类(或封装类) 2. 基本数据类型与对应的包装类: 3. 类型间的转换 4. 何时发生自动装箱和拆箱 赋值.数值运算时 方法调用时 ...

  3. C# tips ---值类型的装箱和拆箱

    装箱过程,如: myStruct myobj= new myStruct(); object baseobj =myobj; 在上述隐式转换中,myobj的内容被复制到堆上,放在一个装箱的对象上,ba ...

  4. [Java开发之路](23)装箱与拆箱

    1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...

  5. [CLR via C#]5.3 值类型的装箱和拆箱

    原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...

  6. C# 装箱和拆箱[整理]

    1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链 ...

  7. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  8. java可以用 lt =判断int吗_int 和 integer:装箱和拆箱的过程,会用到什么方法

    本文转载自[微信公众号:五角钱的程序员,ID:xianglin965],经微信公众号授权转载,如需转载与原文作者联系 原文标题<int 和 integer :装箱和拆箱的过程,会用到什么方法,你 ...

  9. 装箱与拆箱及其性能损失问题

    首先我想了解一下什么是装箱和拆箱 在类型系统中,任何值类型和引用类型都可以和object类型进行转化,装箱转化 是指将一个值类型显式或者隐式的转化为一个object类型,或者是转化成一个被该值类型应用 ...

  10. Integer装箱和拆箱 以及扔玻璃球的题目

    Integer装箱和拆箱,很奇怪的,因此Integer比较不要使用==! package interview; public class IntegerTest { public static voi ...

最新文章

  1. 【C++】C/C++ 中default/delete特性
  2. MIT自然语言处理第三讲:概率语言模型(第四、五、六部分)
  3. Hadoop 运行jar包时 java.lang.ClassNotFoundException: Class com.zhen.mr.RunJob$HotMapper not found...
  4. 15分钟内开始使用Amazon Web Services和全自动资源调配
  5. 3. HTML中的容器标签
  6. POJ 2255 Tree Recovery(已知前序中序,求后序)
  7. java write阻塞_java socket/output stream writes:他们阻塞?
  8. Java使用Swing实现五子棋。
  9. VC文档与视图结构学习总结
  10. java的程序编码,JAVA编码转换的详细过程
  11. RocketMQ开发指导之四——RocketMQ常见问题
  12. Vue开源项目汇总(史上最全)
  13. 黑马旅游网---day1
  14. 黑盒测试白盒测试用例设计
  15. 测试公总号加入微信开放平台
  16. 从B树、B+树、B*树谈到R 树
  17. python编程midi键盘按键错乱_键盘按键错乱有以下几种相应的解决办法
  18. UR机器人(5)-使用变量
  19. 基于JSP校园二手交易系统的设计与实现
  20. word 文档标题样式相同、行距效果不同的解决办法

热门文章

  1. labelmelabelImg项目
  2. Socket中EndPoint只获取ip,不要port
  3. 程序员有意思的导航(持续更新)
  4. 记录一次自己刷bios
  5. 基于51单片机的超声波测距_液位检测_温度检测protues仿真
  6. 数据安全之标准-规范-政策-报告 集合收藏
  7. MySQL数据库——MySQL下载安装
  8. VS2019 error LNK1104:无法打开***.exe的报错
  9. 随着计算机多媒体技术的产生和发展,计算机多媒体技术发展趋向.doc
  10. 转载, 夏令时导致的时间问题