暂时使用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如何解决这个问题?
欢迎任何解决方案
答案 0 :(得分:2)
Person是一个类,因此被引用使用。没有拳击或拆箱。
与可能需要装箱的价值类型相反。
答案 1 :(得分:0)
如果Person类型实际上是一个结构,即未明确声明的结构,则堆上的空间肯定大于System.Object类对象所需的空间。但是,在将数据移动到堆时,对象本身不是您为Add方法赋予的值,此值仅是对盒装对象的引用。如果System.Object是一个结构,那么是的,必须截断数据以适应结构的大小。这就是为什么不允许继承结构的原因。