Box和UnBox是什么意思?

Gib*_*boK 11 .net c# boxing unboxing

可能重复:
为什么我们需要在C#中装箱和拆箱?
什么是拳击和拆箱以及有什么权衡取舍?

在C#中,doe sit意味着什么:"Box and UnBox"?

这里是MSDN的摘录,我在这里创建了Text.

但这种便利需要付出代价.添加到ArrayList的任何引用或值类型都隐式地向上转换为Object.如果项目是值类型,则在将它们添加到列表时必须将它们装箱,并在检索它们时取消装箱.铸造,装箱和拆箱操作都会降低性能; 在必须迭代大型集合的情况下,装箱和拆箱的效果可能非常显着.

谢谢!

usr*_*ΛΩΝ 27

以下是一个更详细的解释,它介绍了Common Language Runtime的内部.

首先,让我们区分值类型引用类型:

  • 值类型保存在堆栈上,并将其副本传递给调用的方法
  • 引用值保存在托管堆中,并且堆栈仅包含指向其位置的指针(引用).位置而不是对象被传递给被调用的方法

如果您不知道堆栈是什么(不要被冒犯),它是一个存储区域,它在方法中保存局部变量,并用于return指令的调用函数地址(只是简短并提供一般答案).当您调用方法时,堆栈上的足够区域将静态分配给它,因此堆栈分配始终称为静态分配.

相反,堆是一个与堆栈分离的内存区域,运行进程的属性,首先必须对操作系统进行分配,这就是为什么它被称为动态分配(如果你不在if语句中运行)例如,可能不会为您的进程分配内存,而是始终分配堆栈).

只是为了在堆和堆栈上做一个最后的例子:在C++这样的语言中,声明int[100] a;静态地在堆栈上分配100*8个字节(假设为64位系统),同时int* a = new int[100];声明一个8字节(在64位系统上)区域堆栈AND请求堆上的800多个字节,如果可用的话.

现在让我们来谈谈C#:

拳击

由于int是一个值类型,并且在堆栈上分配,当你将它转换为object或任何其他引用类型时(实际上没有其他int可以继承的引用类型,但它是一般规则),该值必须是必需的参考类型.因此,堆上的新区域被分配,对象被装入其中,并且堆栈包含指向它的指针.

拆箱

正好相反:当你有一个引用类型,如对象,并希望将其转换为一个值类型,如int,则新的值必须在堆栈上举行,所以CLR去堆,联合国盒的value并将其复制到堆栈中.

换一种说法

还记得int[]int*例子吗?简单地说,当您使用intC#时,运行时期望其堆栈位置保持该值,但是当您拥有该值object,它期望其实际值位于堆栈指向的堆位置.