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

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

目录

[1 装箱](#1 装箱)

[2 拆箱](#2 拆箱)

[3 性能影响](#3 性能影响)


1 装箱

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

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

2 拆箱

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

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

3 性能影响

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

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

cs 复制代码
            //使用泛型不会发生装箱拆箱 
            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];
相关推荐
我命由我1234511 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
island131419 分钟前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
xcLeigh28 分钟前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh28 分钟前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics
呆呆敲代码的小Y31 分钟前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
秋邱1 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
我的offer在哪里1 小时前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
wenzhangli71 小时前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
串流游戏联盟2 小时前
启程!手机也能邂逅暖暖万相奇观
游戏·远程工作
灵感菇_2 小时前
Java 锁机制全面解析
java·开发语言