问题是,由于性能和 GC 的原因,值类型的数组存储在“内联”中。例如,给定 new FooType[10] {...},如果 FooType是一个引用类型,那么将在托管堆上创建11个对象(一个用于数组,10个用于每个类型实例)。如果 FooType是值类型,那么在托管堆上将只创建一个实例——用于数组本身(因为每个数组值将与数组“内联”存储)。
现在,假设我们有带值类型的继承。当结合上述数组的“内联存储”行为时,坏事情就会发生,如 在 C + + 中所示。
考虑一下这个伪 C # 代码:
struct Base
{
public int A;
}
struct Derived : Base
{
public int B;
}
void Square(Base[] values)
{
for (int i = 0; i < values.Length; ++i)
values [i].A *= 2;
}
Derived[] v = new Derived[2];
Square (v);