C# 装箱和拆箱也是铸造吗?

C# 装箱和拆箱也是铸造吗?,c#,casting,boxing,C#,Casting,Boxing,当我们在基本数据类型之间转换数据类型时,称之为数据类型转换 但在ValueType和ReferenceType之间转换时,我们称之为装箱和取消装箱 装箱和拆箱也可以称为强制转换吗?装箱本质上就是在对象外壳中包装一个值类型。它实际上并不涉及类型转换,比如说,(int)3.14。即使它们都使用cast操作符。装箱是将值类型转换为类型对象并取消装箱以重新获取值的过程 正如将一种类型转换为另一种兼容类型一样,装箱基本上是将一个值类型装箱到一个匿名对象中,以后可以取消装箱 int x = 567; obj

当我们在基本数据类型之间转换数据类型时,称之为数据类型转换

但在ValueType和ReferenceType之间转换时,我们称之为装箱和取消装箱


装箱和拆箱也可以称为强制转换吗?

装箱本质上就是在对象外壳中包装一个值类型。它实际上并不涉及类型转换,比如说,
(int)3.14
。即使它们都使用cast操作符。

装箱是将值类型转换为类型对象并取消装箱以重新获取值的过程


正如将一种类型转换为另一种兼容类型一样,装箱基本上是将一个值类型装箱到一个匿名对象中,以后可以取消装箱

int x = 567;
object y = x; //boxing

int z = (int) y; //z will be 123

int x = 567;
object y = (object)x; //explicit boxing (not necessary)

int z = (int) y; //z will be 123
装箱/取消装箱不应与类型转换混淆,因为装箱时我们只是在变量周围放置一个包装器。通过进行类型转换,实际上是在更改变量或对象的类型

Double x = 3.14444;
Integer y = (Integer)x; //(type cast or static cast in c++) changing the type and loosing the original value too in this case.


int x = 567;
object y = (object)x; //explicit boxing (not necessary)

float z = (float) y; //another example of type casting while unboxing
强制转换:(基本上是将一种类型的实例转换为另一种类型)

装箱:(将值类型复制到堆的过程)

取消装箱(将装箱的值类型复制回堆栈):


希望有帮助。

每个不可为null的值类型都有一个具有相同成员的关联堆对象类型。装箱值类型存储位置将创建一个新的堆类型实例,并将所有字段从值类型存储位置复制到新实例的相应字段。取消绑定值类型将所有字段从其对应堆对象类型的实例复制到值类型存储位置的对应字段。

C#type系统包含三种类型,即值类型、引用类型和指针类型。C#允许我们将值类型转换为引用类型,然后再转换回值类型。将值类型转换为引用类型的操作称为装箱,反向操作称为取消装箱

拳击

  • int Val=1
  • objectobj=Val//装箱

  • 第一行,我们创建了一个值类型Val,并为Val赋值。第二行,我们创建了Object Obj的一个实例,并为Obj赋值。从上面的操作(objectobj=i)中,我们看到了将值类型的值转换为相应引用类型的值。这些类型的操作称为装箱

    拆箱

  • int Val=1
  • objectobj=Val//装箱

  • inti=(int)Obj//拆箱

  • 前两行显示了如何框选值类型。下一行(inti=(int)Obj)显示从对象中提取值类型。将引用类型的值转换为值类型的值。此操作称为取消装箱


    装箱和拆箱是计算成本很高的过程。当一个值类型被装箱时,必须分配和构造一个全新的对象,而且取消装箱所需的强制转换在计算上也是昂贵的

    谢谢您的快速回答。等待任何其他答复!“问题是我们能把装箱和拆箱称为类型转换吗?”LaysomeSmith补充了一点细节
    int a = (int) 3.14 // from the example above does casting with loosing precision.
    double b = a; // casting again (we may write (double) a - gives the same result).
    
    object c = new MyStruct(); // MyStruct = struct.
    object d = 1;
    object e = (int) 3.14; // here we have actually casting and then boxing.
    
    Button f = (MyStruct) c;
    int g = (int) d; // it still unboxing however it looks exactly like the line #1 above.