.net必须知道的几个概念2

  • 本文将解释.Net中的六个重要概念,它们分别是堆栈,堆,值类型,引用类型,装箱和拆箱。首先解释当你声明一个变量时在内存中会发生什么,接着介绍两个重要的概念堆栈和堆,然后介绍值类型和引用类型,文章最后用例子介绍了装箱和拆箱对性能的影响。
  •  

    装箱(boxing)和拆箱(unboxing)

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

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

     

     

     装箱和拆箱过程示意

    图 8 装箱和拆箱过程示意

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

     

    装箱和拆箱

    图 9 装箱和拆箱

    装箱和拆箱的性能影响

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

     

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

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值