C# 一看就懂的装箱拆箱案例

文章目录

    • 装箱(Boxing)
    • 拆箱(Unboxing)
    • 编程语言中的装箱与拆箱优缺点

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

      装箱(Boxing)

      当一个值类型(如整数、结构体或枚举等)需要转换为对象(System.Object)或接口类型时,系统会自动创建一个新的对象实例,并将该值类型变量的值复制到新创建的对象中。这个过程就称为装箱。例如:

      int value = 42; // 值类型变量
      object obj = value; // 装箱:将value装入新的Object引用类型中
      

      在这个例子中,value 是一个值类型的整数变量,将其赋给 object 类型的变量 obj 时,编译器会在堆上分配一块内存,创建一个新的 System.Object 实例,并将 value 的值拷贝到这块内存中。

      拆箱(Unboxing)

      相反,从引用类型转换回值类型的过程被称为拆箱。这意味着你需要明确地将存储在引用类型中的值类型数据提取出来,放回到值类型变量中。如果尝试拆箱的对象实际不是一个对应值类型的装箱实例,则会抛出 InvalidCastException 异常。例如:

      object obj = 42; // 创建一个装箱后的对象引用
      int intValue;
      if (obj is int) // 检查对象是否可以安全地拆箱为int
      { intValue = (int)obj; // 拆箱:从对象中取出原始的int值
          Console.WriteLine(intValue); // 输出:42
      }
      

      在这段代码中,我们首先有一个已装箱的 object 类型变量 obj,然后通过类型转换表达式 (int)obj 进行拆箱操作,将 obj 中存储的整数值重新转换回 int 类型并赋值给 intValue 变量。拆箱前使用 is 关键字进行检查是一个好的编程实践,以确保安全性。

      编程语言中的装箱与拆箱优缺点

      优点:

      1. 兼容性:装箱允许值类型与引用类型之间进行交互,如将值类型传递给接受 object 类型参数的方法或存储在 ArrayList、Dictionary 等集合中。
      2. 泛型和接口支持:通过装箱,值类型可以实现泛型类或接口要求的引用类型约束。

      缺点:

      1. 性能损失:装箱和拆箱操作均涉及内存分配和复制,对性能有一定影响。频繁的装箱拆箱会增加GC(垃圾回收)的压力,并可能导致程序运行速度降低。
      2. 额外开销:每次装箱都需要创建一个新的对象实例,占用额外的堆空间;拆箱时需要进行类型检查并从对象中提取值类型数据,也存在一定的运行时开销。
      3. 异常风险:在拆箱过程中,如果对象实际类型与目标值类型不符,则会抛出 InvalidCastException 异常,需要开发者确保安全拆箱或者捕获可能的异常。

      python推荐学习汇总连接:

      50个开发必备的Python经典脚本(1-10)

      50个开发必备的Python经典脚本(11-20)

      50个开发必备的Python经典脚本(21-30)

      50个开发必备的Python经典脚本(31-40)

      50个开发必备的Python经典脚本(41-50)

      ————————————————

      ​最后我们放松一下眼睛