在我看来,这就是我认为的拳击和拆箱。而已。有人可以确认这是正确的吗?
答案 0 :(得分:6)
没有
虽然总的想法是正确的,但它并不完全正确。盒装值是符合System.Object
的内存布局的完整对象。这意味着一个v表指针(为System.Object
和Equals
等GetHashCode
虚拟方法提供特定于类型的重载,并用作类型标记以防止拆箱与不兼容类型)和(可选)同步监视器。
存储在盒装值句柄中的实际地址不是指向内容,而是指向附加的元数据。
答案 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)并且具有可变引用语义(请注意所有值类型)当盒装时,表现为可变引用类型);系统不能非常方便地提供变异,但是盒装值类型实例可以在没有基础值类型的情况下进行变异。