一、简述
装箱是将值类型转换成引用类型。
拆箱是将引用类型转换成值类型,只有装箱过的对象才能拆箱。
二、装箱和拆箱的内部操作是什么样的?
.NET中,数据类型划分为值类型和引用(不等同于C++的指针)类型,与此对应,内存分配被分成了两种方式,一为栈,二为堆,注意:是托管堆。
值类型只会在栈中分配。 引用类型分配内存与托管堆。(托管堆对应于垃圾回收。)
装箱:
对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。按三步进行。
1:首先从托管堆中为新生成的引用对象分配内存(大小为值类型实例大小加上一个方法表指针和一个SyncBlockIndex)。
2:然后将值类型的数据拷贝到刚刚分配的内存中。
3:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。
可以看出,进行一次装箱要进行分配内存和拷贝数据这两项比较影响性能的操作。
拆箱:
1、首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。
2、将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。
经过这2步,可以认为是同boxing是互反操作。严格意义上的拆箱,并不影响性能,但伴随这之后的拷贝数据的操作就会同boxing操作中一样影响性能。
三、什么时候会发生装箱和拆箱
调用含有object类型的方法的时候,传入值类型的时候就会发生装箱,方法之中处理该参数的时候会发生拆箱。
定义泛型的时候,如果为了通用定义object类型,当添加值类型的时候就会发生装箱和拆箱。
四、效率影响
从原理上可以看出,装箱时,生成的是全新的引用对象,会分配托管堆的空间并且拷贝值,这会有时间损耗,也就是造成效率降低。

C# 装箱和拆箱,以及使用场景相关推荐

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

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

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

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

  3. 1.1 Java包装类、装箱和拆箱

    在 Java 的设计中提倡一种思想,即一切皆对象.但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是 Java 为每种基本 ...

  4. C# 装箱和拆箱、理论概念(非原创)

    注意:在装箱的过程中,会新生成一个堆(托管堆)对象,他值类型的值复制到引用类型(堆对象)中,此后,值类型变量的更改,不会影响引用类型.在拆箱时,会生成一个新的堆栈类型变量,将引用类型的值复制到值类型( ...

  5. java装箱和拆箱的意义_java的自动拆箱和装箱是每个程序员都要知道的

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西. 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动 ...

  6. 装箱与拆箱的概念及意义

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

  7. C#中定义装箱和拆箱详解

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

  8. 装箱和拆箱分别什么意思?

    一.定义: 简单来说:装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型. 装箱:用于在垃圾回收堆中储存值类型.装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换. 拆箱 ...

  9. 自动装箱、拆箱了解多少?

    写在前面 Java 为我们提供了 8 种基本数据类型,为什么还需要提供各自的包装类型呢?您可能会觉得这个问题问的很奇怪,但是我觉得还是值的思考的. 因为 Java 是一门面向对象的语言,基本数据类型并 ...

最新文章

  1. 3检测人头_基于人头检测技术客流统计摄像头及管理平台
  2. 第四章-分布式数据库HBase
  3. java调用wcf_详解JAVA调用WCF服务的示例代码
  4. 工作39:注意传参和返回
  5. vscode配置C++ CMake项目
  6. 邻接表的建立与spfa算法
  7. 3D物理引擎JiglibFlash
  8. 查找php超时原因_php环境搭建(正确配置nginx和php)
  9. 前端安全沙箱技术如何解决开源安全问题?
  10. Python办公自动化入门-Excel合并同类项内容
  11. Edge浏览器Alt+Tab快捷键切换其他应用窗口
  12. 直接灰度变换法matlab,数字图像处理-灰度变换(附MATLAB代码)
  13. 获取服务器微信头像更改不同规格图片大小
  14. cp2102驱动下载链接
  15. 看懂了数智化转型的产业链逻辑,也就看懂了用友BIP
  16. HD2014 青年歌手大奖赛_评委会打分
  17. CHM电子书反向编译器及注册机
  18. Macbook电池健康管理工具—AlDente
  19. Java中时间格式化(获取指定时间)
  20. PCB 720全景图嵌入登入界面应用实现

热门文章

  1. 一对一直播源码,实现一个简单的登录界面
  2. MQL5:zig-zag 指标
  3. Linux服务器挂掉,使之自动重启脚本
  4. 国风虚拟人形象频频亮相,虚拟数字人为传统文化传播提供了新载体
  5. 聊聊接口性能优化的11个小技巧
  6. 云服务器怎么设置成代理服务器?
  7. RedisGeo实现增删改查 java计算指定坐标最近的距离并排序
  8. linux下用命令修改图片像素
  9. 对比分析高速传输和同步软件:Aspera 与 镭速(Raysync)
  10. 实时采集福利彩票的中奖信息和最新开奖信息-JAVA