2010-06-05 71 views
5
var i = new int[2]; 

为“I”认为是盒装?拳击与拆箱

+1

哪种语言? C#? – kennytm 2010-06-05 13:01:01

+0

在C#语言.. – Vivek 2010-06-05 13:03:41

+1

@MarkRushakoff :)我知道这是一个旧的帖子,但我笑我的屁股,实际上洒了一些咖啡:)) – 2014-01-02 10:35:13

回答

4

C#中的数组是引用类型,所以不需要装箱。然而,你将不得不在这个例子中拳击:

var i = 123; 
object o = i; 
7

假设这是C#(var和C#的数组语法),不,i没有装箱。只有原始值类型(想象数值)可以被装箱。

在数组中的值不被任一盒装,因为在基本数组值没有得到装箱。

+1

你可以包装任何结构,包括你自己写的,所以拳击是比这意味着更深远一点。值类型在.NET中以结构体的形式实现。 – Donnie 2010-06-05 13:49:34

9

不,没有什么可以装箱的。 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。如果这些项目的值类型为 ,则当 已添加到列表中时,必须将它们装箱,并在 检索时将它们取消装箱。铸造 和装箱和拆箱操作 都会降低性能; 装箱和取消装箱的效果可能相当 在 必须迭代大型集合的场景中很有效。

MSDN Link to ArrayList

Link to Boxing in C#

3

拳击只有当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