当我们在原始数据类型之间转换数据类型时,它被称为数据类型转换。
但是当在ValueType和ReferenceType之间进行转换时,我们将其称为装箱和拆箱。
装箱和拆箱也可以称为铸造吗?
答案 0 :(得分:8)
拳击只是在对象外壳中包装一个值类型。它实际上并不涉及类型转换,例如(int)3.14
。即使他们都使用演员操作员。
答案 1 :(得分:2)
C#Type System包含三种类型,它们是值类型,引用类型和指针类型。 C#允许我们将值类型转换为引用类型,然后再转换回值类型。将值类型转换为引用类型的操作称为Boxing,反向操作称为Unboxing。
拳击
int Val = 1;
Object Obj = Val; //Boxing
第一行我们创建了一个Value Type Val并为Val分配了一个值。第二行,我们创建了一个Object Obj的实例,并将Val的值赋给Obj。从上面的操作(Object Obj = i),我们看到将Value Type的值转换为相应的Reference Type的值。这些类型的操作称为拳击。
取消装箱作为
int Val = 1;
Object Obj = Val; //Boxing
int i = (int)Obj; //Unboxing
前两行显示如何设置值类型。下一行(int i =(int)Obj)显示从Object中提取值类型。即将参考类型的值转换为值类型的值。此操作称为UnBoxing。
拳击和解锁是计算上昂贵的过程。当一个值类型被装箱时,必须分配和构造一个全新的对象,而且UnBoxing所需的强制转换在计算上也很昂贵
答案 2 :(得分:0)
装箱是将值类型转换为类型对象并取消装箱后退值的过程http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
casting就是将一种类型转换为另一种兼容类型
答案 3 :(得分:0)
拳击基本上是将值类型装入匿名对象,以后可以取消装箱。
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
答案 4 :(得分:0)
Casting :(它基本上是关于将一种类型的实例转换为另一种类型)
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.
希望它有所帮助。
答案 5 :(得分:0)
每个不可为空的值类型都有一个关联的堆对象类型,它们具有相同的成员。装箱值类型存储位置会创建新的堆类型实例,并将所有字段从值类型存储位置复制到新实例的相应字段。取消装箱值类型会将其对应堆对象类型的实例中的所有字段复制到值类型存储位置的相应字段。