2012-09-19 73 views
4

我念叨ValueType class,如果,当一些被浇铸为值类型,我想知道它是否得到盒装?例如:C#拳击铸造值类型

void DoSomething(ValueType valueType) 
{ 
} 

DoSomething(5); 

没有通过DoSomething的方法获得通过时的字面5代表的int得到盒装?

+3

我认为[Marc Gravell在你的链接中的提示](http://msdn.microsoft.com/en-us/library/system.valuetype%28v=vs.100%29。aspx#1)是非常明确的,在这个问题:) – dasblinkenlight

+0

另请参见[拳击发生在C - 锐](http://stackoverflow.com/questions/7995606) – nawfal

+0

可能重复[拳击赋值为ValueType? ](http://stackoverflow.com/questions/7205556/boxing-on-assignment-to-valuetype) – colinfang

回答

2

是的,它被装箱。

想想......对,不要让盒装应该有一些共同的二进制表示,可以是任何值类型的价值 - 包括所有内置的那些和任何结构可能会在未来的定义。

由于这样的二进制表示不存在的值必须被装箱。

说明:

当调用带有参数的方法,主叫方置于同意关于位置并在一个位序列的同意关于格式,例如一个int是用编码为1补负数32位,一个双64bit编码的IEEE浮点格式等

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

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

因此,无论何时您使用参数/变量/任何不合适的类型传递一个值,系统必须将该值填满或接收器不会知道太多内存值真正使用以及如何从一系列比特中将该内存解码回数字或结构。

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

+0

你是什么意思“常见的二进制表示?”什么是“int”值类型的常见二进制表示的示例? –

+0

@ZaidMasud - 当你使用参数调用一个方法时,调用者在约定的位置和约定的格式中放置一系列位,例如int是32位,负数编码为1-complement,双位是64位编码在IEEE浮点格式等 - 你不能有一个方法,除了unboxed int和double,因为它不知道要读取多少位以及如何解码它们,... – Nir

+0

... if你确实需要一种方法来接受你可以给函数的值的存储位置(位置本身是已知大小和格式,所以该方法知道如何解码它)和一些元数据,所以该方法知道的实际类型值 - 包装元数据的价值和提供它的内存位置被称为(惊喜,惊喜)“拳击” - ... – Nir

0

根据在MSDN article马克Gravell的评论你链接到它。

应当强调的是,虽然值类型可以用来限制 值值类型,铸造到值类型(隐含地或明确) 仍然是装箱操作;仅为混凝土已知值类型 (“日期时间”,“INT”,等等)可以直接作为处理值类型 - 的ValueType本身被视为一类(因此拳击)。