盒装值只是指向托管堆中存储的值副本的指针吗?

时间:2013-05-23 19:37:05

标签: c# boxing

在我看来,这就是我认为的拳击和拆箱。而已。有人可以确认这是正确的吗?

enter image description here

2 个答案:

答案 0 :(得分:6)

没有

虽然总的想法是正确的,但它并不完全正确。盒装值是符合System.Object的内存布局的完整对象。这意味着一个v表指针(为System.ObjectEqualsGetHashCode虚拟方法提供特定于类型的重载,并用作类型标记以防止拆箱与不兼容类型)和(可选)同步监视器。

存储在盒装值句柄中的实际地址不是指向内容,而是指向附加的元数据。

答案 1 :(得分:1)

.net中的每个值类型实际上定义了两种不同的东西:存储位置类型和堆对象类型。从外部的角度来看,堆类型的行为很像类

class Holder<T> where T:struct
{
  public T This;
  public override String ToString() { return This.ToString(); }
  public override bool Equals(object other) { return This.Equals(other); }
  etc.
}

包装暴露了所有值类型的公共方法。然而,堆类型将具有一些额外的魔力,因为它将实现底层值类型实现的任何接口[如上所述,通过包装对value-type方法的调用]。此外,与堆对象关联的Type将与与存储位置关联的Type相同。

请注意,值类型存储位置包含值类型的实例并且具有值语义,但引用类型存储位置保存堆对象引用(或者为null)并且具有可变引用语义(请注意所有值类型)当盒装时,表现为可变引用类型);系统不能非常方便地提供变异,但是盒装值类型实例可以在没有基础值类型的情况下进行变异。