装箱和拆箱时的C#堆空间分配

时间:2013-08-22 15:33:12

标签: c# clr cil

暂时使用C#,我一直在想这个:

public static void Main(Strings[] args){
    ...
    Person p = new Person("Bob",23,"Male");
    List<Object> al = new List<Object>();
    al.Add(p);
    Person p = (Person)al[0];
}

在Collection中装箱和取消装箱的典型示例,但问题是:当装箱变量时,CLR在GC堆中分配额外空间并将p视为对象,但Person类比System.Object <更大< / p>

因此,根据这一点,可能会丢失Person类另外拥有的一些值,在取消装箱后它将无法获得一些数据。

CLR如何解决这个问题?

欢迎任何解决方案

2 个答案:

答案 0 :(得分:2)

Person是一个类,因此被引用使用。没有拳击或拆箱。

与可能需要装箱的价值类型相反。

答案 1 :(得分:0)

如果Person类型实际上是一个结构,即未明确声明的结构,则堆上的空间肯定大于System.Object类对象所需的空间。但是,在将数据移动到堆时,对象本身不是您为Add方法赋予的值,此值仅是对盒装对象的引用。如果System.Object是一个结构,那么是的,必须截断数据以适应结构的大小。这就是为什么不允许继承结构的原因。