var i = new int[2];
“i”被认为是盒装?
答案 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。如果是的话 值类型,它们必须装箱时 添加到列表中,并在取消装箱时 他们被检索。两个铸造 以及装箱和拆箱操作 降低性能;的效果 拳击和拆箱可以相当 在你的情况下很重要 必须遍历大型集合。
答案 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。