C#中的拳击和拆箱

时间:2012-07-28 05:11:41

标签: c# heap-memory boxing

在C#中,根据文件说明, “装箱值类型将其打包在Object引用类型的实例中。这允许将值类型存储在垃圾收集堆上。”

如果没有“垃圾收集堆”会发生什么?垃圾收集堆已完全分配,并且没有“垃圾收集堆”内存可用? 它会抛出异常还是分配到其他地方?

3 个答案:

答案 0 :(得分:4)

这是一个像其他任何对象一样的对象分配。如果没有可用内存且无法通过垃圾回收提供任何内存,您将获得OutOfMemoryException

你可以想到这段代码:

int x = 10;
object o = x;

就像:

int x = 10;
object o = new Int32_Wrapper(x);

其中Int32_Wrapper将是“boxed int”类。 (你不能在C#中明确地做到这一点,但这是基本的效果。)

答案 1 :(得分:0)

它更像是垃圾收集器的堆。也就是说,GC存储在该存储空间中的对象被“检查”。但是,它最常见的只有堆,因为当前的CLR实现中没有其他堆=)

- 安德烈·卡利尔

答案 2 :(得分:0)

当垃圾收集堆完全分配时,GC将被触发释放内存,更多内存(来自OS托管VM)可以添加到托管堆,直到没有更多可用,此时内存不足异常将是抛出。