转换为ValueType时的C#boxing

时间:2012-09-19 10:39:09

标签: c#

我正在阅读有关ValueType class的内容,我想知道,当某些内容被转换为ValueType时,它是否会被装箱?例如:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);

当DoSomething方法收到时,文字int所代表的5是否被包装好了?

3 个答案:

答案 0 :(得分:3)

是的,它被装箱了。

考虑一下......对于没有盒装的值,应该有一些常见的二进制表示,可以是任何值类型 - 包括所有内置的和未来可能定义的任何结构。

由于不存在这样的二进制表示,因此必须将值加框。

说明:

当您使用参数调用方法时,调用者将一系列位置放置在约定的位置并以约定的格式放置,例如,int为32位,负数编码为1-complement,double为64位编码为IEEE浮点格式等

除了unboxed int和double之外,你不能有一个方法,因为它不知道要读取多少位以及如何解码它们ץ

如果你确实想要一个方法来接受这两个方法,你可以给函数提供值的内存位置(位置本身具有已知的大小和格式,以便方法知道如何解码它)和一些元数据,所以方法知道值的实际类型 - 用元数据包装值并提供它的内存位置称为(惊讶,惊讶)“拳击”

所以,任何时候你使用参数/变量传递一个值/不是系统必须装入值的确切类型,或者接收器不会知道该值真正使用的内存以及如何解码该内存一系列位回到数字或结构。

这仅适用于值类型,因为引用类型总是通过使用内存位置传递(内存位置在.net中称为“引用”)。

答案 1 :(得分:2)

是的,ValueType是一个类(因此引用类型会导致拳击)。

这个问题涉及类似的理由:

Why Enum's HasFlag method need boxing?

答案 2 :(得分:0)

根据Marc Gravell在MSDN article中的评论链接到它。

  

应该强调的是,ValueType可以用于限制   值到类型的值,转换为ValueType(隐式或显式)   还是一个拳击手术;只有具体的已知价值类型   (“DateTime”,“int”等)可以直接作为值类型处理 -   ValueType本身被视为一个类(所以拳击)。