是2个还是3个装箱/拆箱示例?
1)文档示例:
int i = 123;
object iBoxed = i;
i = (int) iBoxed;
2:拳击/拆箱也是吗?
int i = 123;
object iBoxed = i;
i = Int32.Parse(iBoxed.ToString());
3:拳击/拆箱也是吗?
int i = 123;
object iBoxed = i;
i = Convert.ToInt32(iBoxed);
我认为在所有例子中技术上都是一样的。
所以我猜2和3是装箱/拆箱的例子吗?
答案 0 :(得分:7)
在所有三个例子中:
iBoxed
是i
。
在示例2中:
这里没有涉及拆箱,因为ToString
是一个最终将解析为int.ToString
的虚拟方法,然后由int.Parse
进行解析,返回一个非加框的int
在堆栈上。
在例3中:
iBoxed
将在方法Convert.ToInt32
的主体中取消装箱,并再次作为非盒装整数返回。
答案 1 :(得分:2)
第二个例子是装箱而不是拆箱。 int.parse不会编译,因为它需要一个字符串,而iBoxed是一个对象。我认为你正在混合拳击和转换的概念。拳击实际上是关于采用值类型,即他们在C中所说的POD,并将其视为参考,拆箱是从容器中提取相同值类型的能力。
Ex 2.已修复
int i = 123; // Assigment
object iBoxed = i ; // This is boxing
i = int.parse(iBoxed.toString()); //This is unboxing but only for the twostring method the assignment is a value type copy.
答案 2 :(得分:1)
拳击是object iBoxed = i
。
示例2无法工作,因为int.Parse
需要字符串
答案 3 :(得分:0)
在所有示例中,值类型i
正在转换为对象。这是根据MSDN的拳击定义。拳击也可以通过以下方式完成:
object boxed = (object)i;
取消装箱是将对象转换回值类型 示例1是拆箱
示例2将无法编译,因为Parse
需要string
参数,但如果您iBoxed.ToString()
示例3我怀疑没有取消装箱,因为Convert
方法只会返回您传入的值。
值得了解拳击和拆箱的性能。它比正常的任务更昂贵。