拳击与拆箱
回答
C#中的数组是引用类型,所以不需要装箱。然而,你将不得不在这个例子中拳击:
var i = 123;
object o = i;
假设这是C#(var
和C#的数组语法),不,i
没有装箱。只有原始值类型(想象数值)可以被装箱。
在数组中的值不被任一盒装,因为在基本数组值没有得到装箱。
你可以包装任何结构,包括你自己写的,所以拳击是比这意味着更深远一点。值类型在.NET中以结构体的形式实现。 – Donnie 2010-06-05 13:49:34
不,没有什么可以装箱的。 var关键字并不意味着变量是boxxed。它在运行时不会进行任何转换。 var关键字严格是C#构造。什么是实际发生的事情,当你使用var为:
var i = new int[1];
IL视其为:
int[] i = new int[1]
现在,如果你是,如果当你将一个int值以阵列的一部分,我做它,询问?
如:
i[0] = 2;
不,它不需要。
这是相对的是不:
var o = new object[1];
o[0] = 2;
这个例子并和为什么使用的ArrayList(认为膨胀阵列)在1.0,1.1(预泛型)是一个巨大的成本。以下注释适用于object[]
例子,以及:
即 加入到ArrayList任何参考或值类型是隐式 上溯造型为Object。如果这些项目的值类型为 ,则当 已添加到列表中时,必须将它们装箱,并在 检索时将它们取消装箱。铸造 和装箱和拆箱操作 都会降低性能; 装箱和取消装箱的效果可能相当 在 必须迭代大型集合的场景中很有效。
拳击只有当value type(即基本类型,结构或枚举)被视为参考类型发生。您的数组声明为保存int
类型的值。 var
keyword只是告诉编译器推断变量i
的类型,而不是手动指定它。
假如你写:
var i = new object[2];
编译器会把它转换到object[] i = new object[2]
,你摆在那里任何int
值将被装箱。你放在同一个数组中的任何引用类型都不需要任何装箱。
总之,var
与拳击无关。
这是.NET中的diagram of different types。您可能还需要阅读.NET Type fundamentals。
哪种语言? C#? – kennytm 2010-06-05 13:01:01
在C#语言.. – Vivek 2010-06-05 13:03:41
@MarkRushakoff :)我知道这是一个旧的帖子,但我笑我的屁股,实际上洒了一些咖啡:)) – 2014-01-02 10:35:13