C#转换为ValueType时的装箱

C#转换为ValueType时的装箱,c#,C#,我在读有关的文章,我想知道,当某个东西被转换为ValueType时,它是否被装箱了?例如: void DoSomething(ValueType valueType) { } DoSomething(5); 根据Marc Gravell在you link is中的评论,当通过DoSomething方法接收时,文本5表示的int是否被装箱 需要强调的是,虽然ValueType可用于限制 值转换为值类型,转换为值类型(隐式或显式) 仍然是拳击手术;只有具体的已知值类型 (“DateTime”、“

我在读有关的文章,我想知道,当某个东西被转换为ValueType时,它是否被装箱了?例如:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);

根据Marc Gravell在you link is中的评论,当通过DoSomething方法接收时,文本
5
表示的
int
是否被装箱

需要强调的是,虽然ValueType可用于限制 值转换为值类型,转换为值类型(隐式或显式) 仍然是拳击手术;只有具体的已知值类型 (“DateTime”、“int”等)可以直接作为值类型处理- ValueType本身被视为一个类(因此装箱)


是的,
ValueType
是一个类(因此引用类型将引发装箱)

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

是的,它被装箱了

想想看。。。对于不装箱的值,应该有一些通用的二进制表示,可以是任何值类型-包括所有内置值和将来可能定义的任何结构

由于这种二进制表示形式不存在,因此必须对值进行装箱

说明:

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

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

如果您确实希望一个方法同时接受这两者,您可以为函数提供值的内存位置(该位置本身具有已知的大小和格式,因此该方法知道如何对其进行解码)和一些元数据,以便该方法知道值的实际类型-使用元数据包装值,并提供调用它的内存位置(惊喜,惊喜)“拳击”

因此,无论何时,只要您使用参数/变量/任何不是系统必须装箱的确切类型传递值,否则接收器将不知道该值实际使用了多少内存,以及如何将内存从一个位序列解码回一个数字或结构


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

我认为这一点非常清楚:)还可以看到“公共二进制表示法”的可能重复
int
值类型的常见二进制表示法的示例是什么?@ZaidMasud-当您使用参数调用方法时,调用者将一系列位放置在约定的位置,并采用约定的格式,例如,int是32位,负数编码为1补码,double是以IEEE浮点格式编码的64位,等等——除了unbox int和double之外,你不能有一种方法,因为它不知道要读取多少位以及如何解码它们。。。。。。如果您确实希望一个方法同时接受这两者,您可以为函数提供值的内存位置(该位置本身具有已知的大小和格式,因此该方法知道如何对其进行解码)和一些元数据,以便该方法知道值的实际类型-使用元数据包装值,并提供调用它的内存位置(惊喜,惊喜)“拳击”--……因此,无论何时,只要您使用参数/变量/系统必须装箱的非精确类型传递值,否则接收器将不知道该值实际使用的内存量,以及如何将该内存从位序列解码回数字或结构好的解释,我建议将解释移到您的co中在你的答案的正文中添加注释。