Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 装箱值是否只是指向存储在托管堆中的值副本的指针?_C#_Boxing - Fatal编程技术网

C# 装箱值是否只是指向存储在托管堆中的值副本的指针?

C# 装箱值是否只是指向存储在托管堆中的值副本的指针?,c#,boxing,C#,Boxing,在我看来,这就是我所认为的拳击和拆箱。没别的了。有人能确认这是正确的吗 没有 虽然总的想法是正确的,但并不完全正确。装箱值是符合System.Object内存布局的完整对象。这意味着一个v表指针(它为System.Object虚拟方法(如Equals和GetHashCode)提供特定于类型的重载,并用作类型标记以防止取消绑定到不兼容的类型)和一个(可选)同步监视器 存储在盒装值句柄中的实际地址并不指向内容,而是指向附加的元数据。在.net中,每个值类型实际上定义了两种不同的类型:存储位置类型和堆

在我看来,这就是我所认为的拳击和拆箱。没别的了。有人能确认这是正确的吗

没有

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


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

在.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.
}
类持有者,其中T:struct
{
公众对此表示怀疑;
公共重写字符串ToString(){返回This.ToString();}
public override bool Equals(object other){返回This.Equals(other);}
等
}
它公开了该值类型的所有公共方法。然而,堆类型将有一些额外的魔力,因为它将实现底层值类型实现的任何接口[如上所述,通过包装对值类型方法的调用]。此外,与堆对象关联的
类型
将与与存储位置关联的
类型
相同


请注意,值类型存储位置保存值类型的实例并使用值语义进行操作,但引用类型存储位置保存堆对象引用(否则为null)并使用可变引用语义进行操作(请注意,所有值类型在装箱时都作为可变引用类型进行操作);系统并没有提供非常方便的变异,但是装箱的值类型实例可以在没有基础值类型发言权的情况下进行变异。

@Foo我认为这是一个公平的问题和很好的图表。是/否问题通常是个坏主意。因此,我们希望答案包含两个或三个以上的字母。@Servy-但问题内容也可能不正确,然后您可以提供有关原因的进一步详细信息。@DarrenDavies如果您知道任何应该关闭的问题,请投票关闭或标记相应的关闭原因。如果你不确定他们是否应该关闭,那么就在meta/chat上提问,其他人可以帮你弄清楚(如果应该关闭,也可能自己投票)。其他一些应该关闭的问题被遗漏的事实并不意味着我们不应该关闭这个问题,因为它符合关闭的标准。如果你想讨论这个问题的优点,meta是一个比这里更好的地方。回答得好。此外,还提供了OPs对“是”/“否”的需求