拳击和拆箱

Viv*_*vek 5 .net c# boxing

var i = new int[2];
Run Code Online (Sandbox Code Playgroud)

"我"被认为是盒装了吗?

kem*_*002 9

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

var i = new int[1];
Run Code Online (Sandbox Code Playgroud)

IL认为它是:

int[] i = new int[1]
Run Code Online (Sandbox Code Playgroud)

现在,如果你问的是,当你为一个数组的一部分分配一个int时,它是否就行了?

如:

i[0] = 2;
Run Code Online (Sandbox Code Playgroud)

不,不是的.

这与以下内容相反:

var o = new object[1];

o[0] = 2;
Run Code Online (Sandbox Code Playgroud)

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

添加到ArrayList的任何引用或值类型都隐式地向上转换为Object.如果项目是值类型,则在添加到列表时必须将它们装箱,并在检索它们时取消装箱.铸造,装箱和拆箱操作都会降低性能; 在必须迭代大型集合的情况下,装箱和拆箱的效果可能非常显着.

MSDN链接到ArrayList

链接到C#中的拳击


Mat*_*nen 7

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

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


RaY*_*ell 4

C# 中的数组是引用类型,因此不需要装箱。然而,在此示例中您将进行拳击:

var i = 123;
object o = i;
Run Code Online (Sandbox Code Playgroud)