当前位置: 首页 > news >正文

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

在 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];

相关文章:

  • 关于Java 反射的简单易懂的介绍
  • 一文熟练掌握Spring Framework
  • 以初学者视角探索智能体学习之旅
  • 新书上线 |《零门槛AIGC应用实战——Serverless+AI 轻松玩转高频AIGC场景》免费下载
  • upload-labs靶场
  • Spring Boot中整合Flink CDC 数据库变更监听器来实现对MySQL数据库
  • 【Python爬虫(48)】分布式爬虫:解锁多领域数据宝藏的密码
  • java Web
  • 宠物智能可穿戴产品调研报告
  • Microsoft Office 2024 软件安装教程(免费)
  • 前端八股——Vue3系列
  • Codeforces 559C 详细题解
  • 深入解析C++函数指针与指针函数:从原理到实战
  • 无法打开包括文件: “crtdbg.h”: No such file or directory
  • 【Blender】二、建模篇--06,曲线建模/父子级和蒙皮修改器
  • 《CentOS 7 镜像源失效终极解决方案(2024年更新)》——生命周期终止后的镜像修复与替代方案
  • Linux编程----filelo(2)
  • 【大模型LLM】DeepSeek LLM Scaling Open-Source Language Models with Longtermism
  • pandas Dataframe介绍以及创建
  • 使用 Python 调用 Ollama API 并调用 deepseek-r1:8b 模型
  • A股低开高走全线上涨:军工股再度领涨,两市成交12934亿元
  • 马新民卸任外交部条约法律司司长
  • 世界人形机器人运动会将在北京“双奥场馆”举行
  • “模”范生上海,如何再进阶?
  • 体坛联播|米兰逆转热那亚豪取3连胜,阿诺德官宣离开利物浦
  • 江南华南较强降雨扰返程,北方大部需防风沙