6

我正在阅读有关ValueType 类的信息,我想知道当某些东西被强制转换为 ValueType 时,它​​是否会被装箱?例子:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);

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

4

3 回答 3

3

是的,它被装箱了。

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

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

解释:

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

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

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

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

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

于 2012-09-19T10:44:37.913 回答
2

是的,它ValueType是一个类(因此是一个引用类型,因此会产生装箱)。

这个问题涵盖了类似的基础:

为什么 Enum 的 HasFlag 方法需要装箱?

于 2012-09-19T10:44:22.543 回答
0

根据 Marc Gravell 在您链接到的MSDN 文章中的评论。

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

于 2012-09-19T10:44:18.523 回答