-3

使用 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“更大”

所以据此,可能会丢失 Person 类额外拥有的一些值,拆箱后将无法获取一些数据。

CLR 如何解决这个问题?

欢迎任何解决方案

4

2 回答 2

2

Person 是一个类,因此通过引用使用。没有装箱或拆箱。

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

于 2013-08-22T15:35:35.730 回答
0

如果 Person 类型真的是一个结构,你没有明确声明,堆上的空间肯定大于 System.Object 类的对象所需的空间。但是,在数据被移动到堆的那一刻,对象本身并不是你赋予 Add 方法的值,这个值只是对装箱对象的引用。如果 System.Object 是一个结构,那么是的,必须截断数据以适应结构的大小。这就是不允许继承结构的原因。

于 2013-08-28T11:03:01.033 回答