9

当我们在原始数据类型之间转换数据类型时,它被称为数据类型转换。

但是当在 ValueType 和 ReferenceType 之间进行转换时,我们称之为装箱和拆箱。

装箱和拆箱也可以称为铸造吗?

4

6 回答 6

8

本质上,装箱只是将值类型包装在对象外壳中。它实际上并不像说那样涉及类型转换(int)3.14。即使他们都使用强制转换运算符。

于 2012-07-16T21:23:21.407 回答
2

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

拳击

  1. int Val = 1;
  2. Object Obj = Val; //Boxing

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

拆箱

  1. int Val = 1;
  2. Object Obj = Val; //Boxing
  3. int i = (int)Obj; //Unboxing

前两行显示了如何将值类型装箱。下一行 (int i = (int) Obj) 显示从 Object 中提取值类型。那就是将引用类型的值转换为值类型的值。此操作称为拆箱。

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

于 2014-03-28T12:20:29.287 回答
0

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

于 2012-09-26T21:26:28.373 回答
0

装箱是将值类型转换为类型对象并取消装箱以取回值的过程http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

以及铸造是将一种类型转换为另一种兼容类型

于 2012-07-16T21:32:35.330 回答
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
于 2012-07-16T21:36:05.327 回答
0

铸造:(基本上是将一种类型的实例转换为另一种类型)

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.

希望能帮助到你。

于 2012-07-16T21:37:59.507 回答