对C#装箱和拆箱的理解

【什么是装箱和拆箱】

装箱(box)是将值类型转换为引用类型的过程,拆箱(unbox)是将引用类型转换为值类型的过程

【装箱过程】

  • 先在堆上分配存储位置。(注解:引用类型的数据值放在堆中)
  • 将值类型数据的值复制到分配好的储存位置
  • 返回储存位置的地址(即引用)

(注解:装箱过程有分配内存和复制数据两个耗费性能(即影响程序整体性能)的操作)

【拆箱过程】

  • 先检查当前的引用类型数据是否可以转换为目标值类型数据(例如,string str="123"可以转换为Int ,而str="asd"不可以)
  • 复制堆中的数据的值并将复制的值放到目标数据所在的存储位置

(注解:拆箱过程有类型检查和复制数据两个操作,其中复制数据耗费性能)

 

【拆箱和装箱实例】

            

【常见的会产生装箱和拆箱的操作】

//装箱操作
int a=5;
string str="a="+5;

【如何解决拆箱和装箱引发的性能问题】

性能问题:如果装箱和拆箱进行得不是很频繁,那么性能问题不大。但有的时候,装箱很容易被忽视,而且会非常频繁地发生,这可能大幅影响性能。(对小的项目而言,我们不必要专门考虑装箱和拆箱对性能的影响,当前的计算机硬件足够强,其产生的影响可以忽略不计。平时写代码多注意下,不要忽视常见的会产生装箱和拆箱的操作的即可。)

解决方法:多使用泛型

【参考】

[1]https://blog.csdn.net/qiaoquan3/article/details/51439726

[2]《C#本质论5.0》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值