C# 装箱(Boxing)与拆箱(Unboxing)
C# 装箱(Boxing)与拆箱(Unboxing)
在 C# 中,装箱和拆箱是与值类型(如结构体)和引用类型(如类)之间的转换相关的操作。它们是类型系统的一部分,但如果不正确使用,可能会导致性能问题。以下是对装箱和拆箱的详细解释。
1. 装箱(Boxing)
1.1 定义
装箱是指将值类型(如 int、double、struct 等)转换为引用类型(如 object 或 System.ValueType)。装箱操作会创建一个对象实例,并将值类型的值复制到堆内存中。
1.2 示例代码
int num = 10; // 值类型,存储在栈内存 object obj = num; // 装箱操作:将 num 转换为 object 类型
1.3 内存分配
-
装箱操作会将值类型的值复制到堆内存中。
-
堆内存中的对象包含值类型的值,并且会占用额外的内存空间。
-
装箱操作会增加内存分配的开销。
1.4 使用场景
-
当需要将值类型作为引用类型传递时(例如,将
int转换为object)。 -
当需要将值类型存储到只能接受引用类型的集合中(如
ArrayList)。
1.5 性能影响
-
装箱操作会增加内存分配的开销,因为需要在堆上创建对象。
-
装箱操作会增加垃圾回收的负担,因为堆上的对象需要被垃圾回收器管理。
2. 拆箱(Unboxing)
2.1 定义
拆箱是指将引用类型(如 object)转换回值类型(如 int)。拆箱操作会从堆内存中提取值,并将其复制回栈内存。
2.2 示例代码
int num = 10; // 值类型 object obj = num; // 装箱操作 int unboxedNum = (int)obj; // 拆箱操作:将 object 转换回 int
2.3 注意事项
-
拆箱操作必须显式进行类型转换。
-
如果引用类型中存储的值类型与目标类型不匹配,会抛出
InvalidCastException异常。 -
拆箱操作只会成功,如果引用类型确实包含对应的值类型。
2.4 性能影响
-
拆箱操作会增加额外的内存复制开销。
-
拆箱操作需要进行类型检查,这会增加运行时的开销。
3. 装箱与拆箱的性能问题
3.1 内存分配
-
装箱操作会在堆上创建对象,增加内存分配的开销。
-
拆箱操作需要从堆内存中提取值,增加内存访问的开销。
3.2 垃圾回收
-
装箱操作会增加垃圾回收的负担,因为堆上的对象需要被垃圾回收器管理。
-
频繁的装箱和拆箱操作会导致性能下降,尤其是在高频率的循环中。
3.3 示例
以下代码展示了装箱和拆箱操作的性能问题:
int[] numbers = new int[1000000];
object[] boxedNumbers = new object[1000000];
// 装箱操作
for (int i = 0; i < numbers.Length; i++)
{boxedNumbers[i] = numbers[i]; // 每次装箱都会在堆上创建对象
}
// 拆箱操作
for (int i = 0; i < boxedNumbers.Length; i++)
{numbers[i] = (int)boxedNumbers[i]; // 每次拆箱都需要类型转换
}
-
装箱和拆箱操作会导致大量的内存分配和垃圾回收,严重影响性能。
4. 避免装箱和拆箱
4.1 使用泛型
-
泛型集合(如
List<T>)可以避免装箱和拆箱操作,因为它们直接存储值类型。 -
示例:
List<int> numbers = new List<int>(); numbers.Add(10); // 不会发生装箱
4.2 使用结构体
-
如果需要存储多个值类型,可以使用结构体而不是引用类型。
-
示例:
struct Point {public int X;public int Y; } Point p = new Point { X = 1, Y = 2 };
4.3 避免不必要的类型转换
-
在可能的情况下,直接使用值类型,避免将值类型转换为引用类型。
5. 总结
-
装箱:将值类型转换为引用类型,会增加内存分配和垃圾回收的开销。
-
拆箱:将引用类型转换回值类型,需要显式类型转换,并增加内存访问的开销。
-
性能问题:装箱和拆箱操作会显著降低性能,尤其是在高频率的循环中。
-
优化建议:优先使用泛型集合(如
List<T>),避免不必要的类型转换,减少装箱和拆箱操作。
通过理解装箱和拆箱的机制,以及它们对性能的影响,可以更好地优化代码,提高应用程序的性能。
相关文章:
C# 装箱(Boxing)与拆箱(Unboxing)
C# 装箱(Boxing)与拆箱(Unboxing) 在 C# 中,装箱和拆箱是与值类型(如结构体)和引用类型(如类)之间的转换相关的操作。它们是类型系统的一部分,但如果不正确使…...
【AD】3-10 原理图PDF导出
文件—智能PDF 多页原理图导出 导出设置时选择工程,可自行选择导出一页或多页原理图,一般PCB不用导出...
SQL命令详解之增删改数据
目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中,增、删、改是最基础的操作,它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…...
Docker 部署 MinIO 对象存储服务
Docker 部署 MinIO 对象存储服务 前言一、准备工作1. 安装 Docker2. 确认服务器架构 二、设置 MinIO 容器的目录结构三、启动一个临时的 MinIO 容器来获取配置文件四、复制 MinIO 配置文件到本地目录五、删除临时 MinIO 容器六、创建并运行 MinIO 容器,挂载本地目录…...
IP段转CIDR:原理Java实现
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
翻译: 深入分析LLMs like ChatGPT 一
大家好,我想做这个视频已经有一段时间了。这是一个全面但面向普通观众的介绍,介绍像ChatGPT这样的大型语言模型。我希望通过这个视频让大家对这种工具的工作原理有一些概念性的理解。 首先,我们来谈谈你在这个文本框里输入内容并点击回车后背…...
springboot之HTML与图片生成
背景 后台需要根据字段动态生成HTML,并生成图片,发送邮件到给定邮箱 依赖 <!-- freemarker模板引擎--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifa…...
数据结构(初阶)(三)----单链表
单链表 概念 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结点 与顺序表不同的是,链表的结构类似于带车头的火车车厢,,链表的每个车厢都是独立…...
ChatGPT与DeepSeek:AI语言模型的巅峰对决
目录 引言 一、ChatGPT 与 DeepSeek 简介 (一)ChatGPT (二)DeepSeek 二、技术原理剖析 (一)ChatGPT 技术原理 (二)DeepSeek 技术原理 (三)技术原理对比…...
DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能
2025 年 2 月 21 日至 23 日,上海徐汇西岸,2025 全球开发者先锋大会以 “模塑全球,无限可能” 的主题,围绕云计算、机器人、元宇宙等多元领域,探讨前沿技术创新、应用场景拓展和产业生态赋能,各类专业论坛、…...
人工智能之数学基础:线性代数中矩阵的运算
本文重点 矩阵的运算在解决线性方程组、描述线性变换等方面发挥着至关重要的作用。通过对矩阵进行各种运算,可以简化问题、揭示问题的本质特征。在实际应用中,我们可以利用矩阵运算来处理图像变换、数据分析、电路网络等问题。深入理解和掌握矩阵的运算,对于学习线性代数以…...
(上)基于机器学习的图像识别——遥感图像分类(LeNet-5;AlexNet;VGGNet;GoogLeNet;ResNet)
遥感图像识别: 专业词汇: kernel:卷积 目录 遥感图像分类 1.1 LeNet-5 视频来源: 任务:使用什么网络实现遥感图像的分类 LeNet-5结构: 遥感图像分类 1.2 AlexNet(冠军) 视频…...
数据集笔记:NUSMods API
1 介绍 NUSMods API 包含用于渲染 NUSMods 的数据。这些数据包括新加坡国立大学(NUS)提供的课程以及课程表的信息,还包括上课地点的详细信息。 可以使用并实验这些数据,它们是从教务处提供的官方 API 中提取的。 该 API 由静态的…...
HTML元素,标签到底指的哪块部分?单双标签何时使用?
1. 标签(Tag) vs 元素(Element) 标签(Tag) 标签是 HTML 中用于定义元素的符号,用尖括号 < > 包裹。例如 <img> 是标签。元素(Element) 元素是由 标签 内容…...
基于ai技术的视频生成工具
一、通用型AI视频生成工具 腾讯智影 特点:支持数字人播报、文字转视频,提供免费模板和素材库,登录即送5分钟免费时长,每日签到可兑换额外额度。 限制:免费版分辨率较低,部分高级功能需付费。 LunaAI.vid…...
【Java 后端】Restful API 接口
Restful API 接口 REST:Representational State Transfer,表现层(前端的视图页面和后端的控制层)资源状态转移。 一种软件架构的风格(格式) RESTful 是目前最流行的互联网软件架构,如果一个架…...
Matlab地图绘制教程第2期—水陆填充图
上一期分享了海岸线图的绘制方法: 本着由浅入深的理念,本期再来分享一下水陆填充图的绘制方法。 先来看一下成品效果: 特别提示:Matlab地图绘制教程系列,旨在降低大家使用Matlab进行地图类科研绘图的门槛,…...
企业知识库搭建:14款开源与免费系统选择
本文介绍了以下14 款知识库管理系统:1.Worktile;2.PingCode;3.石墨文档; 4. 语雀; 5. 有道云笔记; 6. Bitrix24; 7. Logseq等。 在如今的数字化时代,企业和团队面临着越来越多的信息…...
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…...
Android内存优化指南:从数据结构到5R法则的全面策略
目录 一、APP 内存限制 二、内存的三大问题 2.1、内存抖动(Memory Churn) 2.1.1 频繁创建短生命周期对象 2.1.2 系统API或第三方库的不合理使用 2.1.3 Handler使用不当 2.2、内存泄漏(Memory Leak) 2.2.1 静态变量持有Activity或Context引用 2.2.2 未取消的回调或…...
如何利用Chanlun-Pro实现智能缠论量化交易:3步掌握市场结构识别
如何利用Chanlun-Pro实现智能缠论量化交易:3步掌握市场结构识别 【免费下载链接】chanlun-pro 基于缠中说禅所讲缠论理论,以便量化分析市场行情的工具 项目地址: https://gitcode.com/gh_mirrors/ch/chanlun-pro 在金融市场日益复杂的今天&#x…...
OpenRocket:开源火箭设计与飞行仿真的终极指南
OpenRocket:开源火箭设计与飞行仿真的终极指南 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 你是否曾经梦想设计自己的火箭,但又…...
EA(Enterprise Architect)UML修改字体大小
EA(Enterprise Architect)是一个很优秀的建模工具(支持UML、数据库建模等),它安装包很小,不到100MB,还支持生成C#代码。于是,我从Rational Rose换到了EA。 EA默认的字体只有8磅&…...
3个核心优势:用AI智能体彻底解放你的桌面生产力
3个核心优势:用AI智能体彻底解放你的桌面生产力 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop 在数…...
张雪机车五夺WSBK分站冠军,海光信息成国产芯片一哥,硬核科技崛起!
张雪机车:WSBK赛场五度夺冠 昙花一现?不,现在都五现了。5月16 - 17日的WSBK捷克站,车手德比斯驾驶张雪机车820RR赛车,连续两回合夺冠。这是张雪机车本赛季第五个WSBK分站冠军。 如果说最早一次的夺冠是处于“新车优待期…...
ElevenLabs青少年语音TTS效果对比测试:12款竞品横评,仅2家通过COPPA 3.0儿童语音伦理认证
更多请点击: https://kaifayun.com 第一章:ElevenLabs青少年语音TTS的技术定位与伦理边界 ElevenLabs推出的青少年语音合成(Teen Voice TTS)并非简单的声音风格扩展,而是基于多说话人自监督表征学习与音色解耦建模的高…...
模块型OLT跟光模块有什么区别?
模块型OLT跟光模块有什么区别?明明是同一个 SFP 接口,插上去长得也差不多,为什么有的叫“光模块”,有的叫“模块型 OLT”? 它们到底有什么区别?能不能互换?选错了会怎样?同样是 SFP …...
NVIDIA Profile Inspector完整指南:解锁显卡隐藏性能,游戏帧数提升50%
NVIDIA Profile Inspector完整指南:解锁显卡隐藏性能,游戏帧数提升50% 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为游戏卡顿、画质不佳而烦恼吗?NVIDIA Pro…...
电力市场再调度成本飙升:高比例可再生能源与简化市场设计的结构性矛盾
1. 项目概述:当低净需求成为常态,电力市场再调度成本为何飙升?作为一名长期关注电力市场与能源转型的从业者,我一直在思考一个问题:当风电和光伏成为电力系统的主力军,我们的市场机制真的准备好了吗&#x…...
厂房分区控温需求,水冷空调按需布设灵活调配
在工业生产与商业运营中,高温作业环境长期困扰着企业和劳动者。一方面,传统中央空调的高昂安装与运营成本让大多数中小企业望而却步;另一方面,超大厂房、物流仓库、汽车制造车间等开放或半开放场景,难以实现完全密封&a…...
