拳击与拆箱

时间:2010-06-05 13:00:28

标签: c# .net boxing

var i = new int[2];

“i”被认为是盒装?

4 个答案:

答案 0 :(得分:9)

没有任何东西可以装箱。 var关键字并不意味着变量是boxxed。它在运行时没有进行任何转换。 var关键字严格来说是C#构造。使用var时实际发生的是:

var i = new int[1];

IL将其视为:

int[] i = new int[1]

现在,如果你问是否在为i的数组部分分配一个int时是否包含它?

如:

i[0] = 2;

不,不。

这与之相反:

var o = new object[1];

o[0] = 2;

这个例子和为什么在1.0,1.1(pre generics)中使用ArrayList(想想可扩展数组)是一个巨大的成本。以下注释也适用于object[]示例:

  

任何引用或值类型   添加到ArrayList是隐式的   upcast to Object。如果是的话   值类型,它们必须装箱时   添加到列表中,并在取消装箱时   他们被检索。两个铸造   以及装箱和拆箱操作   降低性能;的效果   拳击和拆箱可以相当   在你的情况下很重要   必须遍历大型集合。

MSDN Link to ArrayList

Link to Boxing in C#

答案 1 :(得分:7)

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

数组中的值也没有加框,因为基本数组中的值不会被加框。

答案 2 :(得分:4)

C#中的数组是引用类型,因此不需要装箱。但是你会在这个例子中有拳击:

var i = 123;
object o = i;

答案 3 :(得分: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