现在的位置: 首页 > 综合 > 正文

.NET中六个你必须知道的重要概念之装箱(boxing)和拆箱(unboxing)

2013年10月08日 ⁄ 综合 ⁄ 共 436字 ⁄ 字号 评论关闭

  说了这么多,在实际编程时怎么使用它们呢?最大的问题是要弄清楚数据从堆栈移到堆的性能损失,反之亦然。

  如下图所示,当我们将一个值类型移到引用类型时,数据也从堆栈移到堆中,当我们将引用类型移到值类型时,数据就从堆移到堆栈中。数据从堆栈移到堆,或是从堆移到堆栈,都会产生较大的性能损失。数据从值类型移到引用类型的过程叫做装箱,从引用类型移到值类型叫做拆箱。


图 8 装箱和拆箱过程示意

  如果你编译上面的代码,在相同的ILDASM中,你会看到在IL中的代码是如何装箱和拆箱的,如下图所示。


图9 装箱和拆箱

  装箱和拆箱的性能影响

  为了查看性能的影响,我们将下面两个函数运行了1000次,如下图所示,左边的函数有装箱拆箱操作,右边的函数没有,我们使用了一个秒表对象监控所花的时间。


图10  有装箱拆箱和无装箱拆箱执行时间对比

  从上图我们看到,有装修拆箱需要花3542毫秒,无装修拆箱只需2477毫秒,因此对性能的影响还是蛮大的。

  现在你对这两个重要的.Net概念是否都理解了呢?

抱歉!评论已关闭.