7

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

在此处输入图像描述

4

2 回答 2

6

不。

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

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

于 2013-05-23T19:46:53.837 回答
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.
}

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

请注意,值类型存储位置保存值类型的实例并以值语义运行,但引用类型存储位置保存堆对象引用(否则为 null)并以可变引用语义运行(请注意,所有值类型,当装箱时, 表现为可变引用类型);该系统并没有非常方便地提供突变,但是装箱的值类型实例可以在没有基础值类型对此事有任何发言权的情况下进行突变。

于 2013-05-23T20:27:26.730 回答