装箱和拆箱是什么?(C#)

devtools/2025/2/26 5:30:21/

在 C# 中,装箱(Boxing)和拆箱(Unboxing)是值类型(Value Type)和引用类型(Reference Type)之间相互转换的过程。

目录

 1  装箱

 2  拆箱

 3  性能影响


 1  装箱

装箱是将值类型转换为引用类型的过程。当一个值类型被装箱时,会在堆上分配一个对象实例,该实例包含值类型的值,然后将这个对象的引用返回。

            int value = 11;object testValue = value;Console.WriteLine($"装箱成功,装箱后的值为:{testValue}");
  • 装箱操作: 定义了一个值类型变量,然后将value装箱为object类型.object 是 C# 中所有类型的基类,属于引用类型。

 2  拆箱

拆箱是将引用类型转换为值类型的过程。在拆箱时,会检查引用类型是否是一个装箱后的值类型,如果是,则将堆上对象中存储的值复制到值类型的变量中。

if (testValue is int){int unboxedValue = (int)testValue;Console.WriteLine($"拆箱后的值{unboxedValue}");}else{Console.WriteLine("拆箱失败,类型不匹配");}
  • 拆箱操作:使用is关键字检查 testValue是否可以转换为int类型,如果可以,则使用强制类型转换进行拆箱操作,将object类型转换回int类型。

 3  性能影响

  • 装箱:装箱操作会在堆上分配内存,并且需要复制值类型的数据到堆上的对象中,这会带来一定的性能开销,尤其是在频繁进行装箱操作时,会导致内存分配和垃圾回收的压力增大。
  • 拆箱:拆箱操作需要进行类型检查,确保引用类型确实是一个装箱后的值类型,然后再将堆上的数据复制到值类型的变量中,同样会有一定的性能开销。

在实际编程中,应尽量避免不必要的装箱和拆箱操作,以提高性能。例如,在使用泛型集合(如List<T>)时,应优先使用值类型作为泛型参数,避免使用非泛型集合(如ArrayList),因为非泛型集合存储的是object类型,会导致值类型的装箱和拆箱操作。

            //使用泛型不会发生装箱拆箱 List<int> list = new List<int>();list.Add(0);int valueList =list[0];//由于ArrayList内部存储的是object,会发生值类型的装箱拆箱操作ArrayList arrayList = new ArrayList();arrayList.Add(10);int arrayTest = (int)arrayList[0];


http://www.ppmy.cn/devtools/162734.html

相关文章

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

Visual Studio Code 跨平台安装与配置指南(附官方下载链接)

一、软件定位与核心功能 Visual Studio Code&#xff08;简称VS Code&#xff09;是微软开发的开源跨平台代码编辑器&#xff0c;支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块&#xff0c;可自动生成单元测试代码和API文档注释。 二、下载…

选择排序:简单高效的选择

大家好&#xff0c;今天我们来聊聊选择排序&#xff08;Selection Sort&#xff09;算法。这是一个非常简单的排序算法&#xff0c;适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称&#xff0c;虽然它的效率不如其他高效算法&#xf…

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年&#xff0c;由法国工程师Fabrice Bellard主导开发&#xff0c;其名称源自"Fast Forward MPEG"&#xff0c;初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护&#xff0c;逐步发展成为包含音视频采…

服务器释放screen资源(Detached状态并不会释放资源)

你可以使用 screen 命令来列出所有会话并手动关闭它们&#xff0c;或者直接终止所有的会话来释放资源。以下是如何操作的步骤&#xff1a; 1. 列出所有 screen 会话 你已经使用 screen -ls 列出了当前所有的 screen 会话。输出中显示了每个会话的 ID 和状态&#xff08;Detac…

并发 -- 无锁算法与结构

文章目录 什么是无锁算法什么是原子变量什么是CAS操作Compare-And-Swap Weak在哪些情况下会失败举例说明无锁结构无锁结构的问题 什么是无锁算法 无锁算法&#xff08;Lock-Free Algorithm&#xff09;是一种并发编程技术&#xff0c;旨在实现多线程环境下的高效数据共享&…

Windows10配置C++版本的Kafka,并进行发布和订阅测试

配置的环境为&#xff1a;Release x64下的环境 完整项目&#xff1a;https://gitee.com/jiajingong/kafka-publisher 1、首先下载相应的库文件&#xff08;.lib&#xff0c;.dll&#xff09; 参考链接&#xff1a; GitHub - eStreamSoftware/delphi-kafka GitHub - cloade…

【每日论文】TESS 2: A Large-Scale Generalist Diffusion Language Model

下载PDF或阅读论文&#xff0c;请点击&#xff1a;LlamaFactory - huggingface daily paper - 每日论文解读 | LlamaFactory | LlamaFactory 摘要 我们推出了TESS 2&#xff0c;这是一种通用的指令跟随扩散语言模型&#xff0c;其性能优于当代的指令调整扩散模型&#xff0c;有…