C#装箱和取消装箱分析

C#系列教程——装箱取消转换 代码如下: using System; class Unboxing_Test { static void Main() { int i = 100; object o = i; // 装箱 try { int j = (short)o; // 取消装箱 阅读详情
 
把值类型的实例转换为引用类的实例,就称为装箱,其逆过程称为取消装箱。
在C#中,这种情况常常在我们未意识的情况下发生的。但是,理解发生了什么是很重要的,所以先介绍一下这两个过程:
1, 把值类型转换为对象
考虑下面代码
ArrayList myArrayList = new ArrayList();
 
myArrayList.Add(new Money(2500.0));
 
ArrayList是一个标准的集合类,它包含一个对象的引用集合。这些对象必须是引用类型,所以必须位于托管堆上。而方法Add()需要一个对象作为参数。
Money是一个结构 是值类型的实例,要把它添加到ArrayList中,CLR会在托管堆上自动创建Money实例的一个装箱副本。此时,装箱表示CLR给实例添加了一个包装器,使它的显示和行为类似于一个引用类型。这是自动进行的。
 
装箱的对象包含值对象的数据副本。如果装箱的对象修改了,不会影响原来的值对象。同样,如果原来的值对象修改了,也不会影响装箱的对象。这正是值类型所期望的。
 
当从ArrayList中检索值时,可以使用[]语法返回托管堆上的对象的引用。例如:
Money myMoney = (Money) myArrayList[0];
在使用显示类型转换把它赋予Money实例时,CLR就会从装箱的对象中提取该值,把它复制到本地的Money实例中。这术就有了该值的一个副本,修改它不会影响原来的值和堆上的装箱值。这就是取消装箱的达程,在C#中它也是自动完成的。
 
2, 装箱和取消装箱的过程
C#自动完成装箱和取消装箱过程,可是在这个过程中会增加系统开销。下面深入的探讨一下它们的具体过程。
当把Money值类型添加到ArrayList中时发生的情况:
(1)    首先利用new运算符,创建一个基于栈的Mnoey类型
(2)    C#编译器认为,AeeayList类的Add()方法需要一个引用类型,而不是一个值类型,所以调用MSIL代码执行装箱操作
(3)    在托管堆上分配内存,这包括Money结构中的字段需要的内存,以及把装箱的类型建立为引用类型所需要的额外内存
(4)    基于栈的Money实例是利用new运算符创建的,其上的字段要逐个字节地复制到新分配的堆内存上
(5)    最后,返回堆上保存的对象的地址,并传给ArrayList类的Add()方法
取消装箱的过程:
(1)    在栈上为myMoney变量分配内存,调用默认的构造函数来初始化面员字段
(2)    检查装箱引用,如果为NULL 则抛出NullReferenceException异常
(3)    根据显示类型转换过程中的声明 来检查装箱对象的类型 如果不是 则抛出InvalidCastException异常
(4)    最后得到堆上装箱值类型的一个指针,把Money字段的内容复制到栈的变量中
可以看出来,如果应用程序中执行了许多装箱和取消装箱过程,那么性能和内存使用方面的开销就会狠大
3, 其他装箱的情况
上面的例子是把值类型作为参数传给一个需要引用类型的方法。其实还有其它地方会发生装箱操作。
只要隐式或显式地把值类型的实例转换为引用类型,也会发生装箱操作。例:
int number = 43;
object o = nember;              //装箱
int anotherNumber = (int)o;       //取消装箱
 
在把值类型转换为接口时,也会发生装箱操作。
 
在检查对象的类型时,例
Money someMoney = new Money(4.0);
Type t = someMoney.GetType();          
这种情况上,someMoney也装箱了,这是因为Money没有直接实现GetType();因为它继承了System.ValueType. 为了实现这个方法调用,CLR需要一个指向Money方法表的指针,它只能通过装箱someMoney来获得。
 
 
总结:最好是限制装箱和取消装箱的次数,如果应用程序进行许多这样的操作,则把数据类型定义为类比定义为结构更有效。
 
CocosCreator 面试题(十五)Cocos Creator如何内置protobuf JS版本? 接着,它创建了一个 Player 对象,并使用 protobuf.js 提供的 API 对其进行序列化和反序列化操作。其中,name 和 level 是普通的字段,items 是一个 repeated 字段,表示它可以包含多个值。在 Cocos Creator 中使用 protobuf.js,我们需要先加载 .proto 文件,然后使用 protobuf.js 提供的 API 进行序列化和反序列化操作。JSON和XML是文本格式,更易于阅读和调试,而且在对人类友好的接口和数据交换上更为常见和广泛支持。 阅读详情

相关推荐

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 517

(二)CSharp-数据类型

11 种数值类型1)不同长度的有符号和无符号整数类型。2)浮点数类型 float 和 double。3)一种称为 decimal 的高精度小数类型。与 float 和 double 不同,decimal 类型可以准确地表示分数。decimal 类型常用于货币的计算。一种 Unicode 字符类型 char。一种布尔类型 bool。string,它是一个 Unicode 字符数组。object,它是所有其他类型的基类。dynamic,使用动态语言编写的程序集时使用。

用来学习的地方 1917

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 267

C#基础概念

  1.     面向对象的思想主要包括:继承 多态 封装 ●       封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。 ●       继承:子类拥有父类的所有数据和操作。 ●       多态:一个程序中同名的不同方法共存的情况。   有两种形式的多态– 重载与重写。   2.     什么是装箱和拆箱 装箱(boxing)和拆箱(...

weixin_34008784的博客 471

基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计

针对设施农业场景中狭窄通道、障碍物多样(如农机具、作物植株、水管)的特点,设计一款基于 STM32 的小型搬运机器人避障控制系统。系统通过多传感器融合实现 360° 环境感知,采用模糊 PID 控制算法实现平滑避障,满足温室、大棚等场景的搬运需求。通过在温室环境测试,系统可实现对直径≥5cm 障碍物的有效检测(检测距离误差≤5%),避障转向半径≤30cm,平均功耗≤15W。后续可通过增加激光雷达(如 TFmini)提升远距离障碍物检测能力,结合 SLAM 算法实现路径规划。

weixin_42300449的博客 860

CloudCompare 二次开发:插件中的 PCL 环境配置与编程

在进行 CloudCompare 的二次开发过程中,我们常常需要使用点云库(Point Cloud Library,简称 PCL)来处理和分析点云数据。在 CloudCompare 的界面中,选中一个点云对象,然后点击菜单栏中的 “插件” -> “MyPluginAction”。插件将对选中的点云对象进行体素滤波处理,并更新显示结果。下面我们将展示一个简单的插件编程示例,该示例使用 PCL 对输入的点云数据进行体素滤波处理。方法进行体素滤波处理,并将结果点云赋值给选中的点云对象。文件并点击 “打开”。

2301_79331387的博客 283

基础--最简单明了的拆箱装箱解释,带实例

前言 在JAVA中,拆箱和装箱操作是发生在基本数据类型和其包装类之间的一种操作。 JAVA中的八种基本类型有:byte short int long float double boolean char 每一种基本数据类型在java中对应的会有一个包装类,其目的是为了丰富其功能。对应关系如下图所示: 一、名词解释 装箱:将基本数据类型转为其包装类就为装箱操作 拆箱:将其包装类转为基本数据类型就为拆箱操作 二、原理:(以int和包装类Integer讲解,其他的类型同理) Integer a

雨不会一直下,但是一直会下雨 819

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 896

浅析装箱与拆箱操作

什么是装箱和拆箱 简单来说,装箱就是把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。例如, Integer a = 10; 而拆箱则是将引用类型的对象简化成值类型的数据,例如, b = new Integer(10); 在java.lang包中,有如下的对应关系: byte _ Byte char _ Char short ...

阿劼 9039

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 72

22、常见加密哈希算法及安全机制解析

本文详细解析了多种常见加密哈希算法,包括SHA系列、RIPEMD、Tiger、HAVAL、Whirlpool等,涵盖其工作原理、安全性与性能对比。同时探讨了哈希攻击方式如预映像攻击和彩虹表,并介绍了盐、MAC、HMAC等防御机制。结合密码存储、消息完整性验证及区块链应用案例,分析了不同场景下的算法选择建议,并展望了哈希算法在创新、融合与标准化方面的未来发展趋势。

seed的博客 391

[导入]全面认识装箱与折箱

学C#有近一年了,对装箱与拆箱有了一定的了解,但昨天晚上看了.framework编程后,才发现自己的认识都只是片面的。 首先说明:为什么要清楚装箱与折箱,因为装箱与折箱对程序的性能有很大的影响,因此在写代码的时候要时刻注意这些问题。 装箱与折箱都只对值类型数据而言,而对于引用类型数据,都是在托管的堆上运行的,也就不存在装箱与折箱问题了,也就不讨论了。 对于所有的基本数据类型,除了string...

weixin_34203426的博客 141

深度解析大众点评反爬机制:构建高可用店铺评论采集系统(2026最新实战)

在中文互联网数据采集领域,大众点评(现归属美团)始终占据着特殊地位。其丰富的UGC(用户生成内容)包含了超过2亿条真实店铺评论、数百万家商户的详细POI信息以及用户行为数据,对商业分析、口碑监测、本地生活趋势研究具有不可替代的价值。然而,大众点评的安全团队投入了顶级资源构建反爬系统——从请求签名、行为验证到设备指纹,其防御强度甚至超过多数电商平台。本文将完整呈现一套2026年依然有效的技术方案,包括破解核心参数_token、动态代理池维护、无头浏览器指纹伪装等,最终产出一个生产级采集框架。目录。

2201_76125261的博客 811

【C#异步流性能优化指南】:掌握IAsyncEnumerable在大数据处理中的高效应用

掌握C#异步流在大数据处理中的高效应用,提升系统性能与响应速度。本文详解IAsyncEnumerable适用场景、核心实现方法及内存优化策略,帮助开发者高效处理海量数据流。支持实时数据读取与异步迭代,降低资源消耗,值得收藏。

PixelWander的博客 929

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

装箱和取消装箱

装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程。 常见语言运行时 (CLR) 对值类 型进行装箱时,会将值包装在 System.Object 实例中并将其存储在托管堆中。 取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。 装箱和取消装箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值 都被视为一个对象。 下例将整型变量 i 进行了装箱并分配给对象 o 。 int i = 123; // The following line boxes i...

juandaidai的博客 263

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#装箱和拆箱

文章目录C#装箱和拆箱题记:何为装箱和拆箱? C#装箱和拆箱 题记: 最近一个研究项目,需要分解C#写的一个工程软件。只好从头回顾下C#语言的特色。其中一项内容就是对C#装箱和拆箱的认识和理解。拙笔写一篇博客来记录一番。 何为装箱和拆箱? 想必大家都见识过和“装集装箱柜”吧,把一大堆的货物先纸箱或者托盘打包,然后整齐地放进集装箱柜。C#这里的装箱指的是把不同类型的数据打包成在一起。 来看标准的手册定义: 装箱是将值类型转换为“ object 类型或由此值类型实现的任何接口类型”的过程。 比较拗口是吧,简而言

qq_21291397的博客 500

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

装箱和取消装箱(C# 编程指南)

装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程。 当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。 取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。 装箱和取消装箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值都被视为一个对象。 下例将整型变量 i 进行了装箱并分配给对象 o。 C...

Last Order 931

C#装箱和取消装箱(拆箱)

装箱和取消装箱 - C# | Microsoft Learn

醉酒的李白、的博客 224

为什么我们需要在C#中装箱和拆箱?

Why do we need boxing and unboxing in C#? 为什么我们需要在C#中装箱和拆箱? I know what boxing and unboxing is, b

xfxf996的博客 825

如何提高装箱和拆箱的效率

show toc 欢迎来到 MSDN > 开发语言和工具 打开包装! 快点! 发布日期: 3/15/2001 | 更新日期: 6/25/2004

tanliyoung的专栏 2078

C# 之装箱与拆箱

知识点  值类型。 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。 值类型超出作用范围系统自动释放内存。 主要由两类组成:结构,枚举(enum),结构分为以下几类: 整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong) 浮点型(Float、Double) decimal bool 用户定义的结构(struc...

Hello world. 623

C# 装箱和撤箱

把值类型的实例转换为引用类的实例,就称为装箱,其逆过程称为取消装箱。在C#中,这种情况常常在我们未意识的情况下发生的。但是,理解发生了什么是很重要的,所以先介绍一下这两个过程:1, 把值类型转换为对象考虑下面代码ArrayList myArrayList = new ArrayList(); myArrayList.Add(new Money(2500.0)); A

C or C# 882

C# 指南之装箱与拆箱

知识点   值类型。 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。 值类型超出作用范围系统自动释放内存。 主要由两类组成:结构,枚举(enum),结构分为以下几类: 整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint

gsky的专栏 1149

C# 装箱拆箱

所有类型共用一组通用运算。任何类型的值都可以一致地进行存储、传输和处理。此外,C# 还支持用户定义的。C# 采用统一的类型系统,因此任意类型的值都可视为。是所有类型的最终基类。,可以将值类型的值视为对象。每种 C# 类型都直接或间接地派生自。,即可将引用类型的值视为对象。等基元类型)均继承自一个根。所有 C# 类型(包括。

boan2018的博客 961

【C#学习笔记】装箱和拆箱

当我们执行装箱操作的时候,一方面将值类型的装箱类型记录在了堆上,同时将堆上的object的值赋值为了123,并且在栈上同时创建了一个引用o用于引用堆上的object。如果一个变量被装箱引用后还需要被拆箱引用,倒不如直接赋值一个新的变量,因为对值类型进行装箱时,必须创建一个全新的对象, 这可能比简单的引用赋值用时最多长 20 倍。

milu_ELK的博客 937

【C# 装箱(Boxing)与取消装箱(Unboxing)】

文章来自微软官网:http://msdn.microsoft.com/zh-cn/library/yz2be5wk.aspx   装箱是将值类型转换为object类型或由此值类型实现的任何接口类型的过程。当CLR对值类型进行装箱时,会将该值包装到System.Object内部,再将后者存储在托管堆上。取消装箱将从对象中提取值类型。   装箱是隐式的;取消装箱是显示的。   装箱和...

weixin_30610755的博客 194
上一篇: java中控件的事件处理流程
下一篇: C#中的序列化和反序列化
anthit
博客等级 码龄21年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值