转换为ValueType时的C#boxing

Zai*_*sud 6 c#

我正在阅读有关ValueType类的内容,我想知道,当某些东西被转换为ValueType时,它是否被盒装了?例:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);
Run Code Online (Sandbox Code Playgroud)

当DoSomething方法收到时,由int文字表示的是否5被包装?

Nir*_*Nir 3

是的,它被装箱了。

\n\n

考虑一下......为了不将值装箱,应该有一些常见的二进制表示形式,可以是任何值类型 - 包括所有内置的以及您将来可能定义的任何结构。

\n\n

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

\n\n

解释:

\n\n

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

\n\n

你不能有一种方法可以排除未装箱的 int 和 double,因为它不知道要读取多少位以及如何解码它们\xd7\xa5

\n\n

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

\n\n

因此,每当您使用参数/变量/任何不准确的类型传递值时,系统都必须对该值进行装箱,否则接收者将不知道该值实际使用的内存以及如何从序列中解码该内存位返回到数字或结构。

\n\n

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

\n